在(至少)Firefox Web Console和JSBin中,我得到了
> {} + []
0
> a = {} + []
"[object Object]"
在这两种情况下,Node.js都会返回"[object Object]"
。根据规范,哪种行为是正确的?如果是第一个,为什么?
答案 0 :(得分:15)
在浏览器控制台上,当前面没有=
(或其他一些更改其上下文的代码)时,{}
被视为块,不是对象文字。
由于该块为空,因此无效,只留下+ []
。
一元加号运算符将数组转换为数字0
。
答案 1 :(得分:1)
当对象使用运算符时,javascript解释器应使用valueOf方法将值转换为基元,该方法实际上使用内部ToPrimitive函数将类型转换中继到对象的内部[[DefaultValue]]方法。
使用plus运算符的示例有点棘手,因为运算符既可以作为数学加法也可以作为字符串连接。在这种情况下,它连接对象的字符串表示。
幕后真正发生的事情是:
a = {}.valueOf().toString() + [].valueOf().toString();
由于数组为空,因此toString方法返回一个空字符串,这就是为什么正确的结果应该是[object Object],它是object.valueOf()toString()的返回值。