Javascript对象相加

这次去携程面试笔试有个JS加性操作符系列的题,有几个比较有代表性:

1.[]+[]

2.{}+{}

3.[]+{}

4.{}+[]

5.({}+{})


google一下,解释也有冲突,个人总结如下:

1.[]+[]  这两个都是对象咯,按照JS加性操作符规则里,有一个为对象,则调用toString,得到""+[];然后继续用这个规则,得到“”+“”;最终得到""

2.{}+{} 这个JS是按语句来解析,前半部分花括号,当做代码块儿来处理,后半部分,按一元操作符对“{}”处理。把{}它当做对象来应用一元加性操作符。它是对象,调用valueOf()后,它是一个Object;再尝试用toString(),说白了就是将Ojbetc变性让它能够被数值或字符串处理。调用toString()后,+{}是"[object object]",然后再调用Number对其转值(因为一元操作符是针对数值的操作嘛,而加性操作符既可以对数值操作,也可以字符串操作,但字符串优先级高一些),结果Number函数对"[object object]"这破玩意儿无能为力,只能为NaN,故而{}+{}的结果为NaN.

3.[]+{} 对于这个,JS还是按语句来解析,[]是一个对象,按照加性操作符规则,调用toString()——加性操作符只会调用toString,不会调用valueOf,故而得到""+{},第二个嘛,还是调用toString,不像上一条把“+”当做一元操作符对待,故而这句的结果是"[ojbect object]"


4.{}+[]  相当于void后缀了个一元操作+[],调用valueOf或者toString,反正看看各种途径能不能把[]转成一个数值。可以看到用valueOf是不行的,故而用toString使之成为+"",再用Number对“”进行数值转换,结果得到0.


5.({}+{}) 这句话和上面{}+{}就不太一样了,同样是按JS语句解析,但有了小括号,JS解析器进去一看到有个"{}+{}"这个表达式符合加性操作符规则,故而调用其toString方法,得到"[object object][object object]"

你可能感兴趣的:(Javascript对象相加)