我无法理解以下内容:
3 * { valueOf: function(){ return 5} }
//outputs 15
当我尝试这样使用时:
3 * { 5 }
//syntax-error
3 * {valueOf: 5}
//outputs NaN
那么,这究竟是如何与 {}
一起工作的?
最佳答案
区别在于 valueOf
是一个返回数字的函数,还是只是一个数字。 The valueOf
method必须是对象上的函数,因此不使用数字版本。
规范讨论了 valueOf
应该如何在 section 8.12.8 中工作,声明在尝试转换对象时必须考虑调用它:
- Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf".
- If IsCallable(valueOf) is true then,
- Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and an empty argument list.
- If val is a primitive value, return val.
这似乎没有任何情况下 x.valueOf
不可调用,这就是为什么您的 {valueOf: 5}
示例不起作用。
您的第一个案例 (3 * { 5 }
) 是一个语法错误,但即使您在右侧有一个有效对象,也不会像 section 11.5 那样工作规范的一部分尝试将正确的操作数转换为数字,除非您定义一个 valueOf
方法返回可以转换的内容。
请注意 3 * { valueOf: function(){ return "5"} }
工作得很好,因为 "5"
可以通过 toNumber
运行很好(遵循正常的强制转换规则)。
关于javascript - 下面的乘法是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28331148/