有人可以向我解释为什么此代码返回1

时间:2018-09-23 23:45:23

标签: javascript object

为什么这段代码返回1,toString方法甚至没有在任何地方调用,+运算符应将其操作数转换为数字,但我尝试了此操作并返回了NaN

+{} // NaN
+{a: 2} //NaN

那么为什么此代码返回1 ????

+({x:+null , y : +'001' , toString : function(){return this.x+this.y;}})

2 个答案:

答案 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解释器采取的步骤如下:

  1. 呼叫valueOf并将其转换为数字。
  2. 调用toString,如果返回值是原始值,则尽可能将其转换为数字。
  3. 投掷TypeError

在您的情况下,由于您将一元+运算符与非数字对象一起使用,并且一元+运算符仅针对数字定义,因此请执行以下步骤。您的对象没有valueOf,但确实有toString方法,因此,将toString的返回值强制转换为数字,用于计算表达式。

如果您想进一步探索,凯尔·辛普森(Kyle Simpson)出色的You Don't Know JS: Types & Grammar具有更多关于类型强制的知识。