根据我的测试,它总是从左到右
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
但我找不到相关部分在ECMAScript标准中确认这一点。
答案 0 :(得分:17)
JavaScript中的所有运算符都从左到右评估它们的操作数,包括函数调用运算符。首先,按从左到右的顺序评估调用函数,然后评估实际参数。
Section 11.2.3是相关规范部分。
11.2.3函数调用
...
2让 func 成为 GetValue(ref)。
3让 argList 成为评估 Arguments 的结果,生成一个参数值的内部列表(见11.2.4)。
...
你可以看到 ArgumentList 生产是左递归的
11.2.4参数列表
...
生产 ArgumentList : ArgumentList
,
AssignmentExpression 评估如下
和 ArgumentList 在以下措辞中 AssignmentExpression 之前进行评估..
在EcmaScript 3下,一些比较运算符(<
,<=
,>
,>=
)从右到左进行了评估,因为a<=b
是用术语定义的虽然!(b<a)
已被广泛认为是一个规范错误,但主要的解释器并未以这种方式实现,并且已在EcmaScript 5中修复。
来自语言规范:
11.8.5 The Abstract Relational Comparison Algorithm#Ⓣ
比较
x < y
,其中x
和y
是值,会产生true
,false
或undefined
(表示在至少一个操作数是NaN
)。除了x
和y
之外,算法还会将名为 LeftFirst 的布尔标志作为参数。该标志用于控制在x
和y
上执行具有潜在可见副作用的操作的顺序。 这是必要的,因为ECMAScript指定表达式的从左到右的评估。 LeftFirst 的默认值为true,表示x
参数对应于发生的表达式在y
参数的相应表达式的左侧。如果 LeftFirst 为false,则情况相反,必须在y
之前x
执行操作。这样的比较如下进行:
答案 1 :(得分:13)
这里定义:
制作
ArgumentList : ArgumentList , AssignmentExpression
是 评估如下:
- 让
precedingArgs
成为评估ArgumentList
的结果。- 让
ref
成为评估AssignmentExpression
的结果。- 让
arg
为GetValue(ref)
。- 返回一个列表,其长度大于
醇>precedingArgs
的长度,其项目是precedingArgs
的项目, 订单,最后是arg
,它是新的最后一项 列表。
请在此处阅读: http://es5.github.com/#x11.2.4
调用函数时,传入的参数从左到右进行计算。