[英]Why ArraySpeciesCreate is called in Array.prototype.splice?
ES6提到ArraySpeciesCreate
在步驟12中在Array.prototype.splice
中調用,后者根據原始數組創建一個新數組。 為什么需要調用ArraySpeciesCreate
來創建原始數組的副本? Array.prototype.splice
是否在原始數組中直接運行,如下所示?
var a = [1, 2, 3];
a.splice(0, 1); // a is [2, 3] after this statement
為什么需要調用ArraySpeciesCreate來創建原始數組的副本?
它不會創建原始數組的副本(下面更多)。
Array.prototype.splice
是否直接在原始數組中運行?
是。
splice
有兩件事:
它修改你調用它的數組,和
它會創建一個包含您刪除的任何條目的新數組
由於#2使用了ArraySpeciesCreate
,因此使用子類數組,您將獲得子類的實例:
class CustomArray extends Array { } let main = new CustomArray("a", "b", "c", "d"); let deleted = main.splice(1, 2); // Remove and return b and c console.log("main", main); // ["a", "d"] console.log("deleted", deleted); // ["b", "c"] console.log(deleted instanceof CustomArray); // true
注意我們從splice
返回的數組是一個CustomArray
的實例。 這是因為您在問題中標記了ArraySpeciesCreate
。 從規范中ArraySpeciesCreate
的描述:
帶有參數originalArray和length的抽象操作
ArraySpeciesCreate
用於指定使用從originalArray派生的構造函數創建新的Array對象。
注意到最后一點。 基本上, ArraySpeciesCreate
使用原始數組的constructor
屬性來構建新數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.