有人能用javascript解释这种行为吗?

有人能用javascript解释这种行为吗?,javascript,casting,Javascript,Casting,在Firefox中测试: a = [] + 0; b = 0; alert(a); // 0 alert(b); // 0 alert(!a); // false alert(!b); // true []+0是一个字符串。 在Javascript中编写a+b时,引擎将a和b转换为原语。 如果至少有一个结果原语是字符串,它将执行字符串连接;否则,它将执行数字加法 要将对象(如数组)转换为基元,引擎将调用valueOf(),如果其结果不是基元,则将调用toString() 对于数组,valu

在Firefox中测试:

a = [] + 0;
b = 0;

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

alert(!a); // false
alert(!b); // true

[]+0
是一个字符串。
在Javascript中编写
a+b
时,引擎将
a
b
转换为原语。
如果至少有一个结果原语是字符串,它将执行字符串连接;否则,它将执行数字加法

要将对象(如数组)转换为基元,引擎将调用
valueOf()
,如果其结果不是基元,则将调用
toString()

对于数组,
valueOf()
返回原始数组(它不是基元),而
toString()
返回数组内容的逗号分隔字符串

因此,
[]+0
变为
“+0
,即
“0”

非空字符串永远不会出错。

+
会导致
0
进行
求值

因此,
a
的值为
“0”
,而
b
的值为
0

从ECMAScript 11.6.1开始,加法运算符(+)

加法运算符执行字符串串联或数字加法。生产加法表达式:加法表达式+乘法表达式的计算如下:

  • 让lref是计算AdditiveExpression的结果

  • 设lval为GetValue(lref)

  • 让rref是计算乘法表达式的结果

  • 设rval为GetValue(rref)

  • 设lprim为上主元(lval)

  • 设rprim为上主元(rval)

  • 如果类型(lprim)为字符串或类型(rprim)为字符串,则

    a。返回由ToString(lprim)后跟ToString(rprim)连接而成的字符串

  • 返回将加法运算应用于ToNumber(lprim)和ToNumber(rprim)的结果。见 注11.6.3

  • 注1:步骤5和6中对ToPrimitive的调用中未提供任何提示。除Date对象外的所有本机ECMAScript对象都会处理没有提示的情况,就像给出了提示编号一样;日期对象处理没有提示的情况,就好像给出了提示字符串一样。宿主对象可以用其他方式处理没有提示的情况

    注2:第7步与关系运算符(11.8.5)比较算法的第3步不同,它使用逻辑or运算而不是逻辑and运算