在Firefox测试:有人可以在javascript中解释这种行为吗?
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
在Firefox测试:有人可以在javascript中解释这种行为吗?
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
+
concatenation operator导致0
的toString
评估。
因为a
的值是"0"
,而b
的值是0
。
从的ECMAScript 11.6.1加法运算符(+)
加法运算或者执行字符串连接或数字加法。生产AdditiveExpression:
令LREF是评估AdditiveExpression的结果:AdditiveExpression + MultiplicativeExpression如下评价。
让lval成为GetValue(lref)。
让rref是评估乘法表达式的结果。
设rval为GetValue(rref)。
让lprim ToPrimitive(lval)。
设rprim为ToPrimitive(rval)。
如果Type(lprim)是字符串或类型(rprim)是字符串,然后
一个。返回串联ToString(lprim)后跟ToString(rprim)的字符串
返回对ToNumber(lprim)和ToNumber(rprim)应用加法运算的结果。请参阅下面的注释 11.6.3。
注1没有暗示设置在调用ToPrimitive在步骤5个6除日期对象中的所有天然的ECMAScript对象处理没有一个提示的仿佛暗示编号给予;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可能会以其他方式处理缺少提示。
注2步骤7不同于关系运算符(11.8.5)的比较算法的步骤3,通过使用逻辑或操作而不是逻辑和操作。
[] + 0
是一个字符串。
当您在Javascript中编写a + b
时,引擎会将a
和b
转换为原语。
如果至少有一个生成的基元是一个字符串,它将执行字符串连接;否则,它将执行数字加法。
要将对象(如数组)转换为基元,引擎将调用valueOf()
,如果其结果不是基元,则将调用toString()
。
对于数组,valueOf()
返回原始数组(不是原语),toString()
返回数组内容的以逗号分隔的字符串。因此,[] + 0
变成"" + 0
,即"0"
。
非空字符串永远不会是错的。