在Firefox中测试:
a = [] + 0;
b = 0;
alert(a); // 0
alert(b); // 0
alert(!a); // false
alert(!b); // true
答案 0 :(得分:11)
+
concatenation operator会导致对toString
进行0
评估。
因此a
的值为"0"
,而b
的值为0
。
来自 ECMAScript 11.6.1加法运算符(+)
加法运算符执行字符串连接或数字加法。生产AdditiveExpression:AdditiveExpression + MultiplicativeExpression的计算方法如下:
让lref成为评估AdditiveExpression的结果。
让lval成为GetValue(lref)。
让rref成为评估MultiplicativeExpression的结果。
让rval为GetValue(rref)。
让lprim为ToPrimitive(lval)。
让rprim为ToPrimitive(rval)。
如果Type(lprim)是String或Type(rprim)是String,那么
一个。返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串
- 醇>
将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim)。见 请注意以下11.6.3。
注1:在步骤5和6中对ToPrimitive的调用中没有提供提示。除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样;日期对象处理缺少提示,就像提供了提示字符串一样。主机对象可以通过其他方式处理缺少提示。
注2:步骤7与关系运算符(11.8.5)的比较算法的步骤3的不同之处在于,使用逻辑运算而不是逻辑运算。
答案 1 :(得分:3)
[] + 0
是一个字符串
当您在Javascript中编写a + b
时,引擎会将a
和b
转换为基元。
如果至少有一个结果基元是一个字符串,它将执行字符串连接;否则,它将执行数字加法。
要将对象(例如数组)转换为基元,引擎将调用valueOf()
,如果其结果不是基元,则会调用toString()
。
对于数组,valueOf()
返回原始数组(不是原始数组),toString()
返回数组内容的逗号分隔字符串。
因此,[] + 0
变为"" + 0
,即"0"
。
非空字符串绝不是假的。