React.addons.createFragment对象中的元素顺序

zer*_*kms 1 javascript facebook reactjs

我正在阅读https://facebook.github.io/react/docs/create-fragment.html文章,发现FB工程师依赖于对象内存布局(属性的顺序):

if (this.props.swapped) {
  children = React.addons.createFragment({
    right: this.props.rightChildren,
    left: this.props.leftChildren
  });
} else {
  children = React.addons.createFragment({
    left: this.props.leftChildren,
    right: this.props.rightChildren
  });
}
Run Code Online (Sandbox Code Playgroud)

我错过了什么或他们依赖不可靠并提供脆弱的代码?

PS:从ES规范的角度来看问题(我希望它得到回答),而不是一些JS引擎实现的观点(在规范中可能会有变化).

Fel*_*ing 6

(免责声明:我不是代表Facebook发言,这是我自己的看法)

你可能错过了这个音符(可能会更加突出):

另请注意,我们依赖于此处保留对象枚举顺序的JavaScript引擎,这不是规范所保证的,而是由具有非数字键的对象的所有主要浏览器和VM实现.

但是,即将推出的ECMAScript版本(ES6/ES2015)实际上正式化了迭代行为(如果我正确理解规范).

在规范中,关于对象的内部[[Enumerate]]方法说:

[[Enumerate]]必须获取目标对象的属性键,就像调用其[[OwnPropertyKeys]]内部方法一样.

[[OwnPropertyKeys]]定义为

当调用O的[[OwnPropertyKeys]]内部方法时,采取以下步骤:

  1. 让密钥成为新的空列表.
  2. 对于每个自己的属性键P,O是一个整数索引,按升序数字索引顺序
    1. 添加P作为键的最后一个元素.
  3. 对于每个属性的键P,它是一个String但不是整数索引,在属性创建顺序中
    1. 添加P作为键的最后一个元素.
  4. 对于作为符号的O的每个自有属性键P,在属性创建顺序中
    1. 添加P作为键的最后一个元素.
  5. 返回键.