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