我正在阅读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
});
}
我是否遗漏了某些内容,或者他们依赖于不可靠并提供脆弱的代码?
PS:从ES规范的角度来看问题(我期望得到回答),而不是某些JS引擎实现视角(可能会在规范内发生变化)。
答案 0 :(得分:6)
(免责声明:我不是代表Facebook发言,这是我自己的看法)
你可能错过了这个音符(可能会更加突出):
另请注意,我们依赖于此处保留对象枚举顺序的JavaScript引擎,这不是规范所保证的,而是由具有非数字键的对象的所有主要浏览器和VM实现。
然而,即将推出的ECMAScript版本(ES6 / ES2015)实际上正式化了迭代行为(如果我正确理解规范)。
在规范中,有人说object's internal [[Enumerate]]
method:
[[Enumerate]]必须获取目标对象的属性键,就像调用其[[OwnPropertyKeys]]内部方法一样。
And [[OwnPropertyKeys]]
is defined as
当调用O的[[OwnPropertyKeys]]内部方法时,采取以下步骤:
- 让密钥成为新的空列表。
- 对于作为整数索引的O的每个自有属性密钥P,按升序数字索引顺序
- 将P添加为键的最后一个元素。
- 对于属性创建顺序中为字符串但不是整数索引的O的每个自有属性键P.
- 将P添加为键的最后一个元素。
- 对于属性创建顺序中作为符号的O的每个自有属性键P.
- 将P添加为键的最后一个元素。
- 返回键。
醇>