【加号运算符】js中为什么{} + [] = 0 而 [] + {} = '[object Object]'

252 阅读1分钟

运算规则

+有两种使用方法,一种是作为二元运算符,如:a + b,一种是作为一元运算符,如:+'3'

一元运算符

直接转换为 Number 类型,相当于 Number()。常用的还有!运算符,用来转为 Boolean 类型。

二元运算符

a + b 为例

  1. 将a,b转换为原始值(执行ToPrimitive)a1, b1
  2. 如果 a1,b1 中有一个是 string,则都转换为 string 相加
  3. 否则,a1,b1都转换为 number,相加
ToPrimitive(obj,preferredType)函数接受两个参数,第一个obj为被转换的对象
第二个preferredType为希望转换成的类型(默认为空,接受的值为Number或String)
在执行ToPrimitive(obj,preferredType)时如果第二个参数为空并且obj为Date的实例时,此时preferredType会被设置为String,其他情况下preferredType都会被设置为Number

如果preferredType为Number,ToPrimitive执行过程如下:
如果obj为原始值,直接返回;
否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
否则调用obj.toString(),如果执行结果是原始值,返回之;
否则抛异常。

如果preferredType为String,将上面的第2步和第3步调换,即:
如果obj为原始值,直接返回;
否则调用obj.toString(),如果执行结果是原始值,返回之;
否则调用 obj.valueOf(),如果执行结果是原始值,返回之;
否则抛异常。

js中为什么{} + [] = 0 而 [] + {} = '[object Object]'

{} + [] 当语句开始为{时,会被JS解释器认为是代码块,所以实质上运算的是+[],将空数组转为Number,得0

[] + {}使用 ToPrimitive 方法,[]转为'',而{}转为[object Object],最终相加得[object Object]