簡體   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