以下乘法如何工作?

时间:2015-02-04 20:49:36

标签: javascript

我无法理解以下内容:

3 * { valueOf: function(){ return 5} }
//outputs 15

当我尝试这样使用时:

3 * { 5 }
//syntax-error

3 * {valueOf: 5}
//outputs NaN

那么,这究竟是如何与{}一起使用的?

2 个答案:

答案 0 :(得分:5)

区别在于valueOf是一个返回数字的函数,或者只是一个数字。 The valueOf method必须是对象的函数,因此不使用数字版本。

该规范讨论valueOf应该如何在section 8.12.8中工作,声明在尝试转换对象时必须可以调用它:

  
      
  1. 设valueOf是使用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
  2.   
  3. 如果IsCallable(valueOf)为真,那么,   
        
    1. 设val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和空参数列表。
    2.   
    3. 如果val是原始值,则返回val。
    4.   
  4.   

这似乎没有x.valueOf无法调用的情况,这就是您的{valueOf: 5}示例不起作用的原因。

您的第一个案例(3 * { 5 })是一个语法错误,但即使您在右侧有一个有效的对象,也不会作为规范的section 11.5尝试转换右操作数除非你定义一个返回可以转换的东西的valueOf方法,否则为数字。

请注意,3 * { valueOf: function(){ return "5"} }工作得很好,因为"5"可以通过toNumber正常运行(遵循正常的强制规则)。

答案 1 :(得分:0)

valueOf是对象的特殊属性。当一个对象具有作为函数的valueOf属性时,将调用该函数以获取该对象的文字值。

在您的示例中,您正在使valueOf为5的字面值,这不是可以通过javascript调用的函数