根据我的测试,它总是从左到右
>> console.log( console.log(1), console.log(2) );
1
2
undefined undefined
但我在 ECMAScript 标准中找不到确认这一点的相关部分。
JavaScript 中的所有运算符都从左到右计算其操作数,包括函数调用运算符。首先评估要调用的函数,然后按从左到右的顺序评估实际参数。
第11.2.3节 http://es5.github.com/#x11.2.3是相关规格部分。
11.2.3 函数调用
...
2 Let func be 获取值(参考).
3 Let argList是评估的结果论点,生成参数值的内部列表(参见 11.2.4)。
...
你可以看到参数列表产生式是左递归的
11.2.4 参数列表
...
生产参数列表 : 参数列表 ,
赋值表达式评价如下
and 参数列表之前评估过赋值表达式在下面的措辞中..
在 EcmaScript 3 下,一些比较运算符 (<
, <=
, >
, >=
) 从右到左评估a<=b
被定义为!(b<a)
,但这被广泛认为是一个规范错误,主要解释器并没有以这种方式实现它,并且它在 EcmaScript 5 中得到了修复。
从语言规范来看:
11.8.5 抽象关系比较算法 http://es5.github.com/#x11.8.5 # Ⓣ
比较x < y
, where x
and y
是价值,产生true
, false
, or undefined
(这表明至少有一个操作数是NaN
)。此外x
and y
该算法采用一个名为左先作为参数。该标志用于控制具有潜在可见副作用的操作的执行顺序x
and y
. 这是必要的,因为 ECMAScript 指定表达式从左到右的求值。默认值为左先为真并表明x
参数对应于出现在左侧的表达式y
参数对应的表达式。如果左先为 false,则情况相反,并且必须执行操作y
before x
。这样的比较执行如下:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)