[英]Weird behavior of `map()`
AS:為簡單起見,更改了變量名稱。
我的目標是創建一個類似於數組的新類,每個實例都有七個數字,基於任何參數的數量。
所以,代碼是這樣的:
"use strict";
class SevenNumbers extends Array {
constructor(...args) { debugger; // !
// Cut the rest; fill the gaps; convert: first to object, then to primitive
super(...Object.assign([0, 0, 0, 0, 0, 0, 0], args.slice(0, 7)).map(arg => +new Number(arg)));
}
}
它工作正常,所以new SevenNumbers();
返回七個數字的數組,默認(0)或不是。
debugger
-part很重要:它告訴我們如何進入SevenNumbers
類的構造函數。
當我嘗試map()
對象時出現問題。
請嘗試以下代碼:
var arr = new SevenNumbers(8, 7, 6, 5, 4, 3, 2, 1);
// SevenNumbers [8, 7, 6, 5, 4, 3, 2] (without the last).
arr.map(_ => _);
// Array [8, 7, 6, 5, 4, 3, 2].
第一部分以預測的方式工作,但在第3行我們再次進入構造函數!
最令人困惑的是,這里唯一的論點是arr
的長度。 為什么長度?
盡管最終結果是正確的,但這種奇怪的行為會干擾我在實踐中的工作,因為它們之間還有其他的計算方法。
這有什么不對? 為什么不從現成的自定義數組中獲取值,為什么要創建新的?
那是因為map
使用ArraySpeciesCreate來創建一個類似於原始數組的數組。
如果沒有發生這種情況,最后你會獲得一個普通的Array
而不是SevenNumbers
實例。
因此,調用構造函數以構造將使用回調函數和原始實例的項填充的新數組。
如果您不想要它,可以使用Symbol.species
來制作map
調用Array
而不是SevenNumbers
。
class SevenNumbers extends Array { constructor(...args) { console.log(args.toString()); super(...Object.assign([0, 0, 0, 0, 0, 0, 0], args.slice(0, 7)).map(arg => +new Number(arg))); } static get [Symbol.species]() { return Array; } } new SevenNumbers(8, 7, 6, 5, 4, 3, 2, 1).map(_ => _);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.