在Js中,由于它的弱类型语言特性,存在大量的隐式转换。基础类型(即string, boolean,number,null,undefined等)相加,可以参考网上的资料。那么,复杂类型(即对象、数组、自定义类)等相加的情况如何呢?
答案是,复杂类型相加,分成三步:
1、首先调用其valueOf方法,将它转换成基础类型;
2、如果valueOf的结果还不是基础类型,那么继续调用其toString方法,转换成基础类型;
3、若toString的结果仍旧不是基础类型,报错。
那么,在[] + {}
的情况中:
[].valueOf() ---> []
{}.valueOf() ---> {}
[].toString() ---> ''
{}.toString() ---> '[object Object]'
[] + {} ---> '[object Object]'
而在{} + []
的情况中:
{}
被JavaScript解释器当作代码段,实际的运算是+ []
+ [] ---> + '' ---> 0
实际结果是0
在这个例子中,如果手动改写Object和Array的原型上的valueOf默认方法,那么得到的结果就将不同。