3 回答
TA贡献1860条经验 获得超8个赞
[] + []
当使用加法运算符时,左操作数和右操作数都首先转换为原语( 第11.6.1节 )。按 §9.1 ,将对象(在本例中为数组)转换为基元返回其默认值,对于具有有效值的对象,该默认值为 toString()
方法是调用 object.toString()
(第8.12.8节 )。对于数组,这与调用 array.join()
(第15.4.4.2节 )。加入空数组会产生空字符串,因此加法运算符的步骤7返回两个空字符串的连接,即空字符串。 [] + {}
类似于 [] + []
,两个操作数首先转换为原语。对于“对象”(§15.2),这也是调用 object.toString()
,对于非空的、未定义的对象是 "[object Object]"
(第15.2.4.2节 ).{} + []
这个 {}
这里不是被解析为一个对象,而是作为一个空块( §12.1 ,至少只要您没有强迫该语句成为表达式,但稍后会有更多的介绍)。空块的返回值为空,因此该语句的结果与 +[]
..一元 +
操作员( 第11.4.6节 )回报 ToNumber(ToPrimitive(operand))
..我们已经知道, ToPrimitive([])
是空字符串,根据 第9.3.1节 ,ToNumber("")
是0。 {} + {}
类似于上一个案例,第一个 {}
被解析为具有空返回值的块。再一次, +{}
是相同的 ToNumber(ToPrimitive({}))
,和 ToPrimitive({})
是 "[object Object]"
(见 [] + {}
)。所以为了得到…的结果 +{}
,我们必须申请 ToNumber
在绳子上 "[object Object]"
..执行以下步骤时 第9.3.1节 ,我们得到 NaN
因此: 如果语法不能将字符串解释为 字符串数字文学的结果 托内姆 是 非数.Array(16).join("wat" - 1)
按 第15.4.1.1节 和 第15.4.2.2节 ,Array(16)
创建长度为16的新数组。要获得要加入的参数的值, 第11.6.2节 步骤5和步骤6表明,我们必须使用以下方法将两个操作数转换为一个数字 ToNumber
.ToNumber(1)
就是1( §9.3 ),鉴于 ToNumber("wat")
再一次是 NaN
按 第9.3.1节 ..的第7步 第11.6.2节 ,第11.6.3节 口述 如果任一操作数是 非数,结果是 非数.所以争论到 Array(16).join
是 NaN
..第15.4.4.5节( Array.prototype.join
),我们得打电话 ToString
在争论中,也就是 "NaN"
(§9.8.1 ):如果 m是 非数,返回字符串。 "NaN"
.的第10步 第15.4.4.5节 ,我们得到了15个重复的级联 "NaN"
空字符串,等于你看到的结果。使用时 "wat" + 1
而不是 "wat" - 1
作为参数,加法运算符转换 1
转换为字符串,而不是转换 "wat"
对一个数字,所以它有效地调用 Array(16).join("wat1")
.
{} + []
{}
TA贡献1796条经验 获得超4个赞
+
第一步(第9.1节):undefined
, null
obj
打电话 obj.valueOf()
..如果它返回一个原语,您就完成了。直接事例 Object
数组自己返回,所以您还没有完成。 打电话 obj.toString()
..如果它返回一个原语,您就完成了。 {}
和 []
两者都返回一个字符串,这样您就完成了。 否则,抛出一个 TypeError
.
var obj = { valueOf: function () { console.log("valueOf"); return {}; // not a primitive }, toString: function () { console.log("toString"); return {}; // not a primitive }}
Number()
> Number(obj)valueOf toStringTypeError: Cannot convert object to primitive value
第二步(第11.6.1节):
添加回答
举报