js中,对象在转换为原始类型的时候,会调用内置的toPrimitive()函数,转换的过程如下:
- 本身已经是原始类型,直接返回这个值,
- 调用valueOf()方法,如果结果是原始值,那么返回这个值,
- 调用toString()方法,如果结果是原始值,那么返回这个值,
- 否则,抛出错误。
空数组和空对象在进行类型转换时,都会进行以上步骤,且两者都不是原始值,所以会直接调用valueOf()方法,简单的返回两者本身,都不是原始值;
继而会调用toString()方法,空数组得到的结果的‘’空字符串,空对象得到的结果则是字符串'[object Object]';
最后,+号前置会将元素转换为number类型,空字符串‘’转换为0,字符串'[object Object]'则转换为了NaN。