JS中的{} + [] 和 [] + {}

在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默认方法,那么得到的结果就将不同。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。