我正在阅读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引擎实现的角度(可能会在规范中发生变化)。
(免责声明:我不是代表Facebook发言,这是我自己的观点)
你可能错过了这个音符(它可能更占主导地位):
还请注意,我们在这里依赖于保留对象枚举顺序的JavaScript引擎,这不是规范所保证的,而是由所有主要浏览器和VM为具有非数字键的对象实现的。
然而,即将推出的ECMAScript版本(ES6/ES2015)实际上正式化了迭代行为(如果我正确理解规范的话)。
在规范中,它谈到了对象的内部[[Enumerate]]
方法:
[[Enumerate]]必须获得目标对象自己的属性键,就好像通过调用其[[OwnPropertyKeys]]内部方法一样。
并且[[OwnPropertyKeys]]
被定义为
当调用O的[[OwnPropertyKeys]]内部方法时,将采取以下步骤:
- 让键成为一个新的空列表
- 对于作为整数索引的O的每个属性键P,按数字索引升序排列
- 添加P作为键的最后一个元素
- 对于O的每个自己的属性键P,该键是String但不是整数索引,按属性创建顺序
- 添加P作为键的最后一个元素
- 对于作为符号的O的每个自己的特性键P,按特性创建顺序
- 添加P作为键的最后一个元素
- 归还钥匙