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对象初始化和评估顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

记住C中运算符的评估顺序和优先级的快捷方式[重复]

在C中调用函数之前的参数评估顺序[重复]

分配时的 JavaScript 评估顺序

BigDATA面试题

渴望评估/应用顺序和惰性评估/正常顺序

按首字母 Javascript 按字母顺序对对象进行排序和分组