簡體   English   中英

`map()`的奇怪行為

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM