[英]Does Number() explicitly call toString() when value is neither number nor string type? (e.g. function)
由于文档描述了 parseInt() 的这种行为,但没有描述作为函数调用的 Number() 构造函数,因此我正在寻找有关这是否可靠以及是否有来自官方来源的引用的一些见解。 示例代码:
let adder = (function () { let sum = 0 return function add(num) { sum += num add.toString = () => sum //method is overwritten to return value return add } })() console.log(Number(adder(5)(2)(3))) // => 10
请参阅规范。 调用Number
将使用参数调用ToNumeric(value)
,后者将使用参数调用ToPrimitive ,后者(通常)将使用参数和number
提示调用OrdinaryToPrimitive ,它执行:
因此,在将对象转换为数字基元的情况下,将首先尝试调用对象上的valueOf
方法(如果存在)。 如果这样的方法不存在,它将尝试调用对象上的toString
方法。
是的,依靠toString
在valueOf
不存在的情况下被调用是可靠的。
演示如何首先调用valueOf
实时代码段(如果存在):
let adder = (function () { let sum = 0 return function add(num) { sum += num add.toString = () => { console.log('toString called'); return sum; //method is overwritten to return value }; add.valueOf = () => { console.log('valueOf called'); return sum; //method is overwritten to return value }; return add } })() console.log(Number(adder(5)(2)(3))) // => 10
如果对象没有自己的toString
或valueOf
属性,则Object.prototype.toString
将被调用,导致[object Object]
- 但这不会强制转换为数字,从而导致NaN
。
let adder = (function () { let sum = 0 return function add(num) { sum += num return add } })() console.log(Number(adder(5)(2)(3))) // => 10
如果对象不是从Object.prototype
继承的,并且在其原型链中的任何地方都没有toString
或valueOf
,则会抛出错误:
let adder = Object.create(null); console.log(Number(adder))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.