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

时间:2015-04-16 00:08:45

标签: 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
  });
}

我是否遗漏了某些内容,或者他们依赖于不可靠并提供脆弱的代码?

PS:从ES规范的角度来看问题(我期望得到回答),而不是某些JS引擎实现视角(可能会在规范内发生变化)。

1 个答案:

答案 0 :(得分:6)

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

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

  

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

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

在规范中,有人说object's internal [[Enumerate]] method

  

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

And [[OwnPropertyKeys]] is defined as

  

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

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