有人可以在javascript中解释这种行为吗?

Mic*_*oka 8 javascript casting

在Firefox中测试:

a = [] + 0;
b = 0;

alert(a); // 0
alert(b); // 0

alert(!a); // false
alert(!b); // true
Run Code Online (Sandbox Code Playgroud)

use*_*716 11

+ 连接运算引起toString的评估0.

因此,值a"0",而值b0.

来自ECMAScript 11.6.1加法运算符(+)

加法运算符执行字符串连接或数字加法.生产AdditiveExpression:AdditiveExpression + MultiplicativeExpression的计算方法如下:

  1. 让lref成为评估AdditiveExpression的结果.

  2. 设lval为GetValue(lref).

  3. 设rref是评估MultiplicativeExpression的结果.

  4. 设rval为GetValue(rref).

  5. 设lprim为ToPrimitive(lval).

  6. 设rprim为ToPrimitive(rval).

  7. 如果Type(lprim)是String或Type(rprim)是String,那么

    一个.返回串联ToString(lprim)后跟ToString(rprim)的结果的字符串

  8. 将添加操作的结果返回到ToNumber(lprim)和ToNumber(rprim).见11.6.3下面的注释.

注1:在步骤5和6中对ToPrimitive的调用中没有提供提示.除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样; 日期对象处理缺少提示,就像提供了提示字符串一样.主机对象可以以某种其他方式处理缺少提示.

注2:步骤7与关系运算符(11.8.5)的比较算法的步骤3的不同之处在于,使用逻辑或运算代替逻辑运算.