javascript - 当值既不是数字也不是字符串类型时,Number() 是否显式调用 toString()?(例如功能)
问题描述
由于文档描述了 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,它将(通常)
使用参数和提示调用OrdinaryToPrimitivenumber
,它会:
- 断言:类型(O)是对象。
- 断言:提示是字符串或数字。
- 如果提示是字符串,则
- 让 methodNames 为 « "toString", "valueOf" »。
- 别的,
- 让 methodNames 为 « "valueOf", "toString" »。
- 对于 methodNames 的每个元素名称,执行
- 让方法是?获取(O,名称)。
- 如果 IsCallable(method) 为真,则
- 让结果是?调用(方法,O)。
- 如果 Type(result) 不是 Object,则返回结果。
- 抛出 TypeError 异常。
因此,在将对象转换为数字基元的情况下,将首先尝试调用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
or属性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))
推荐阅读
- powershell-4.0 - New-PSDrive:无法将参数绑定到参数“Root”,因为它为空
- python - 如何使用 Python 在 Odoo 11 中的发票上创建计算字段?
- python - UnicodeDecodeError:“ascii”编解码器无法解码位置 6 中的字节 0xf2:序数不在范围内(128)
- delphi - Delphi:如何在 FMX Stringgrid 上绘制复选框?
- android - 在 Android 中重用 recyclerview 的布局和适配器是一种很好的做法吗
- swift - 在 RxSwift getter 函数中使用 Swift 泛型 - 各种问题
- mysql - 当当前日期超过表中的特定日期时,Laravel 自动更新表中的字段
- javascript - 如何获取 javascript 文件内容并解析它以使用它的变量
- python - 正则表达式无法获取空格并且我无法正确拆分字符串?
- java - Android java字符串分割时有空格(空格)