小编典典

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

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
  });
}

我是否缺少某些东西,或者它们依赖不可靠并提供了易碎的代码?

PS:这个问题是从ES规范的角度提出的(我希望可以回答),而不是从JS引擎实现的角度(可能会在规范内更改)。


阅读 253

收藏
2020-07-22

共1个答案

小编典典

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

您可能错过了此注释(可能更为重要):

还要注意,这里我们依靠JavaScript引擎保留对象的枚举顺序,这不是规范所保证的,而是由所有主要的浏览器和VM针对具有非数字键的对象实现的。

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

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

[[Enumerate]]必须获得目标对象自己的属性键,就像通过调用其[[OwnPropertyKeys]]内部方法一样。

并且[[OwnPropertyKeys]]定义为

调用O的[[OwnPropertyKeys]]内部方法时,将执行以下步骤:

  1. 让键成为一个新的空列表。
  2. 对于O的每个自己的属性键P(它是整数索引),以数字索引的升序排列
    1. 将P添加为键的最后一个元素。
  3. 对于每个自己的属性键P of O(按字符串创建,但不是整数索引),按属性创建顺序
    1. 将P添加为键的最后一个元素。
  4. 对于每个自己的符号O的属性键P(按属性创建顺序)
    1. 将P添加为键的最后一个元素。
  5. 返回键。
2020-07-22