javascript - 下面的乘法是如何工作的?

标签 javascript

我无法理解以下内容:

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 中工作,声明在尝试转换对象时必须考虑调用它:

  1. Let valueOf be the result of calling the [[Get]] internal method of object O with argument "valueOf".
  2. If IsCallable(valueOf) is true then,
    1. Let val be the result of calling the [[Call]] internal method of valueOf, with O as the this value and an empty argument list.
    2. 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/

相关文章:

javascript - 获取输入框中选中的文本

javascript - 如何制作显示在多个文本字段中输入的文本的预览布局

javascript - 如何获取 XMLHttpRequest 中的响应 url?

javascript - 如何访问多维数组中的值?

javascript - 如何从内部函数返回值到外部函数

javascript - 数据绑定(bind)在 AngularJS 中是如何工作的?

javascript - 有没有简单的方法可以将单元格从一个表拖放到另一个表?

javascript - 使用 ng-class 附加 css 时 uib-rating 没有变色

javascript - HTTP.GET 不起作用

JavaScript 未在 jsp 中运行