8

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

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

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

4

2 回答 2

15

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

由于该块是空的,它什么也不做,离开+ [].

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

于 2013-08-29T11:59:19.530 回答
1

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

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

幕后真正发生的是:

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

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

于 2013-08-29T12:26:35.667 回答