我正在读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 引擎保留对象枚举顺序,这不受规范保证,但由所有主要浏览器和虚拟机针对具有非数字键的对象实现。
然而,即将推出的 ECMAScript 版本(ES6/ES2015)实际上正式化了迭代行为(如果我正确理解了规范)。
在规范中,提到了一个对象的内部[[Enumerate]] method:
[[Enumerate]] 必须获取目标对象自己的属性键,就像调用其 [[OwnPropertyKeys]] 内部方法一样。
And [[OwnPropertyKeys]]定义为
当调用 O 的 [[OwnPropertyKeys]] 内部方法时,执行以下步骤:
- 让keys成为一个新的空列表。
- For each own property key P of O that is an integer index, in ascending numeric index order
- 添加 P 作为键的最后一个元素。
- For each own property key P of O that is a String but is not an integer index, in property creation order
- 添加 P 作为键的最后一个元素。
- For each own property key P of O that is a Symbol, in property creation order
- 添加 P 作为键的最后一个元素。
- 返回键。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)