javascript对象的元素是否按特定顺序初始化?

我有一个这样的function:

parsers[1] = function(buf) { return { type: "init", name: buf.readUTF8String(), capacity: buf.readUInt32(), port: buf.readUInt16() }; } 

我有任何保证, namecapacityport将被一个接一个地初始化吗? 否则,将以错误的顺序读取缓冲区。

我当然可以回顾一下:

 parsers[1] = function(buf) { var ret = {type: "init"}; ret.name = buf.readUTF8String(); ret.capacity = buf.readUInt32(); ret.port = buf.readUInt16(); return ret; } 

       

网上收集的解决方案 "javascript对象的元素是否按特定顺序初始化?"

感谢@joews的评论,我可以回答我自己的问题。

从链接11.1.5对象初始值设定项 :

句法

ObjectLiteral

  • {}

  • {PropertyNameAndValueList}

  • {PropertyNameAndValueList,}

PropertyNameAndValueList

  • PropertyAssignment

  • PropertyNameAndValueList,PropertyAssignment

简而言之,对象的构造函数只需要一个参数,即没有任何东西,初始化值列表,或者是一个逗号后面的初始化值列表。

初始化值列表由一个PropertyAssignment或一个初始化值列表,后跟一个PropertyAssignment ,基本上是recursion的PropertyAssignment列表。

现在的问题是在最后一个PropertyNameAndValueList , PropertyAssignment ,是否有一个特定的顺序,在这两个组件进行评估?

生产PropertyNameAndValueList:PropertyNameAndValueList,PropertyAssignment的计算方法如下:

  1. obj是评估PropertyNameAndValueList的结果。

  2. propId是评估PropertyAssignment的结果。

订单将保证,如果2.肯定遵循1.

从5.2algorithm约定 :

规范通常使用编号列表来指定algorithm中的步骤。 这些algorithm用于精确指定ECMAScript语言结构所需的语义。 这些algorithm并不意味着使用任何特定的实现技术。 实际上,可能有更高效的algorithm来实现给定的特征。

为了expression清楚,algorithm步骤可以细分为连续的子步骤。

所以,预期的初始化顺序是元素之后的元素,从我可以收集。

和许多其他语言一样,我不会依赖对象的任何“顺序”属性,也不会依赖于它们被初始化或赋值的方式。

如果一个“外部”命令是必要的,我会试图通过这些属性的映射来实现这一点。