为什么`{} + []`在Javascript中从`a = {} + []`返回不同的结果?

时间:2013-08-29 11:57:01

标签: javascript

在(至少)Firefox Web Console和JSBin中,我得到了

> {} + []
0
> a = {} + []
"[object Object]"

在这两种情况下,Node.js都会返回"[object Object]"。根据规范,哪种行为是正确的?如果是第一个,为什么?

2 个答案:

答案 0 :(得分:15)

在浏览器控制台上,当前面没有=(或其他一些更改其上下文的代码)时,{}被视为,不是对象文字。

由于该块为空,因此无效,只留下+ []

一元加号运算符将数组转换为数字0

答案 1 :(得分:1)

当对象使用运算符时,javascript解释器应使用valueOf方法将值转换为基元,该方法实际上使用内部ToPrimitive函数将类型转换中继到对象的内部[[DefaultValue]]方法。

使用plus运算符的示例有点棘手,因为运算符既可以作为数学加法也可以作为字符串连接。在这种情况下,它连接对象的字符串表示。

幕后真正发生的事情是:

a = {}.valueOf().toString() + [].valueOf().toString();

由于数组为空,因此toString方法返回一个空字符串,这就是为什么正确的结果应该是[object Object],它是object.valueOf()toString()的返回值。