为什么这段代码返回1,toString方法甚至没有在任何地方调用,+运算符应将其操作数转换为数字,但我尝试了此操作并返回了NaN
+{} // NaN
+{a: 2} //NaN
那么为什么此代码返回1 ????
+({x:+null , y : +'001' , toString : function(){return this.x+this.y;}})
答案 0 :(得分:2)
+({x:+ null,y:+'001',toString:function(){返回this.x + this.y;}})
您正在重载toString
,该函数返回(+null+'001')
+ null将null强制为0;
+'001'将字符串强制为1
您要从toString返回1。
在先前的情况下,对象文字的非重载toString方法的结果为"[object Object]"
,其强制转换为数字,得到NaN。
这里唯一重要的是toString返回(无论是否已重载)。
答案 1 :(得分:1)
当表达式以需要将其用作数字的方式使用非数字值时,该值首先会转换为其等效的原始值。然后,将原始值强制转换为数字。
JavaScript解释器采取的步骤如下:
valueOf
并将其转换为数字。toString
,如果返回值是原始值,则尽可能将其转换为数字。TypeError
。在您的情况下,由于您将一元+
运算符与非数字对象一起使用,并且一元+
运算符仅针对数字定义,因此请执行以下步骤。您的对象没有valueOf
,但确实有toString
方法,因此,将toString
的返回值强制转换为数字,用于计算表达式。
如果您想进一步探索,凯尔·辛普森(Kyle Simpson)出色的You Don't Know JS: Types & Grammar具有更多关于类型强制的知识。