JavaScript Object Literal Evaluation and valueOf

时间:2015-05-31 21:54:39

标签: javascript

以下代码段的评估结果如何为0.25?我不明白对象文字是如何工作的。

({valueOf: function() { return 1}} / 4)

以下所有其他评估为NaN:

({prop1: function() { return 1}} / 4)

({valueOf: 1} / 4)

({valueOf: "1"} / 4)

还有一些特殊的属性名为'valueOf'吗?

4 个答案:

答案 0 :(得分:1)

Type coercion

如果你打电话

21 + "21" // "2121"

Javascript通过在其上调用toString()来隐式地将数字强制转换为字符串。

同样,在您的示例中,javascript通过调用valueOf()隐式地将您的对象强制转换为数字。

答案 1 :(得分:1)

当您使用/之类的multiplicative operator时,左侧和右侧的表达式将使用ToNumber转换为数字。

由于你有对象,ToNumber使用ToPrimitive,它调用[[DefaultValue]]内部方法。

  

当使用提示调用 O 的[[DefaultValue]]内部方法时   数字,采取以下步骤:

     
      
  1. valueOf 成为使用参数"valueOf"调用对象 O 的[[Get]]内部方法的结果。
  2.   
  3. 如果IsCallable valueOf )是 true 那么,   
        
    1. val 成为调用 valueOf 的[[Call]]内部方法的结果,其中 O 为此值,空参数列表。   2.如果 val 是原始值,则返回 val
    2.   
  4.   
  5. toString 成为使用参数"toString"调用对象 O 的[[Get]]内部方法的结果。
  6.   
  7. 如果IsCallable toString )为真,那么,   
        
    1. str 成为调用 toString 的[[Call]]内部方法的结果, O 作为此值并且空参数列表。
    2.   
    3. 如果 str 是原始值,请返回 str
    4.   
  8.   
  9. 抛出 TypeError 例外。
  10.   

在您的第一个示例中,valueOf可以调用并返回1

但在其他方面没有valueOf或者它不可调用。所以JS调用toString(继承自Object.prototype),返回"[object Object]"。该字符串无法转换为数字,因此NaN

答案 2 :(得分:0)

valueOf是一种特殊情况方法,当需要从对象到标量的隐式类型转换时,它会被调用。所以这是一个特殊的名字。它类似于toString(),只要您需要从对象到字符串的隐式类型转换,就会调用它。见valueOf on MDN

答案 3 :(得分:0)

以下情况:

({valueOf: function() { return 1}} / 4)

除法运算符将第一个参数转换为数字,javascript调用valueOf来执行此操作。

以下情况:

({prop1: function() { return 1}} / 4)

Javascript不知道如何将你的第一个参数转换为数字(并且它找不到valueOf函数来告诉它),因此结果不是数字(NaN)。

在以下情况下:

({valueOf: 1} / 4)

({valueOf: "1"} / 4)

虽然第一个参数确实有一个valueOf成员,但它不是一个函数,因此它没有被使用,结果再次是NaN