[英]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.