我无法理解以下内容:
3 * { valueOf: function(){ return 5} }
//outputs 15
当我尝试这样使用时:
3 * { 5 }
//syntax-error
3 * {valueOf: 5}
//outputs NaN
那么,这究竟是如何与{}
一起使用的?
答案 0 :(得分:5)
区别在于valueOf
是一个返回数字的函数,或者只是一个数字。 The valueOf
method必须是对象的函数,因此不使用数字版本。
该规范讨论valueOf
应该如何在section 8.12.8中工作,声明在尝试转换对象时必须可以调用它:
- 设valueOf是使用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
- 如果IsCallable(valueOf)为真,那么,
醇>
- 设val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和空参数列表。
- 如果val是原始值,则返回val。
这似乎没有x.valueOf
无法调用的情况,这就是您的{valueOf: 5}
示例不起作用的原因。
您的第一个案例(3 * { 5 }
)是一个语法错误,但即使您在右侧有一个有效的对象,也不会作为规范的section 11.5尝试转换右操作数除非你定义一个返回可以转换的东西的valueOf
方法,否则为数字。
请注意,3 * { valueOf: function(){ return "5"} }
工作得很好,因为"5"
可以通过toNumber
正常运行(遵循正常的强制规则)。
答案 1 :(得分:0)
valueOf
是对象的特殊属性。当一个对象具有作为函数的valueOf
属性时,将调用该函数以获取该对象的文字值。
在您的示例中,您正在使valueOf
为5的字面值,这不是可以通过javascript调用的函数