繁体   English   中英

当值既不是数字也不是字符串类型时,Number() 是否显式调用 toString()? (例如功能)

[英]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 ,它执行:

  1. 断言:类型(O)是对象。
  2. 断言:提示是字符串或数字。
  3. 如果提示是字符串,则
    1. 让methodNames 为« "toString", "valueOf" »。
  4. 别的,
    1. 让methodNames 为« "valueOf", "toString" »。
  5. 对于 methodNames 的每个元素名称,请执行
    1. 让方法是? 获取(O,名称)。
    2. 如果 IsCallable(method) 为真,则
      1. 让结果是? 调用(方法,O)。
      2. 如果 Type(result) 不是 Object,则返回结果。
  6. 抛出 TypeError 异常。

因此,在将对象转换为数字基元的情况下,将首先尝试调用对象上的valueOf方法(如果存在)。 如果这样的方法不存在,它将尝试调用对象上的toString方法。

是的,依靠toStringvalueOf不存在的情况下被调用是可靠的。

演示如何首先调用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

如果对象没有自己的toStringvalueOf属性,则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继承的,并且在其原型链中的任何地方都没有toStringvalueOf ,则会抛出错误:

 let adder = Object.create(null); console.log(Number(adder))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM