Javascript对象初始化和评估顺序[重复]
Posted
技术标签:
【中文标题】Javascript对象初始化和评估顺序[重复]【英文标题】:Javascript object initialization and evaluation order [duplicate] 【发布时间】:2013-06-30 13:13:49 【问题描述】:如果我写
var a = [1,2];
var b =
foo: a.pop(),
bar: a.pop()
;
根据规范,b
的值是多少?
(通过实验,它是foo: 2, bar: 1
,但我担心这是否是特定于实现的。)
【问题讨论】:
为什么它是特定于实现的?pop
改变原始数组。
@elclanrs,我认为问题在于对象b
的属性值是否将始终按照它们在代码中列出的顺序进行评估。
哦,我明白了...这实际上是一个很好的问题,但是虽然对象中属性的顺序是微不足道的,但评估的顺序却不是,所以我会说这是非问题,但我可能错了......
【参考方案1】:
参见 ECMAScript section 11.1.5 定义如何解析 ObjectLiteral
产生式。
特别是:
PropertyNameAndValueList
,PropertyName
:AssignmentExpression
评估如下:
评估 PropertyNameAndValueList。
评估 PropertyName。
评估 AssignmentExpression。
...
其中 (1) 是递归定义。
这意味着对象字面量中最左边的项将首先得到评估,因此foo: 2, bar: 1
确实是规范强制要求的。
【讨论】:
【参考方案2】:它们按照编写顺序进行评估。
【讨论】:
以上是关于Javascript对象初始化和评估顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章