爲什麼需要ArraySpeciesCreate被調用來創建原始數組的一個副本?
它不是創建原始數組的副本(更多下面)。
Array.prototype.splice
是否直接在原始數組中操作...?
是的。
splice
做了兩兩件事:
它會修改你怎麼稱呼它的陣列,並
刪除
它創建了一個
新數組包含任何條目
ArraySpeciesCreate
是因爲#2而使用的,所以在使用子類數組的情況下,您會返回一個實例子類:
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
在規範的描述:
的抽象操作ArraySpeciesCreate
與originalArray和長度用於使用從originalArray衍生的構造函數,以指定一個新的Array對象的創建參數。
請注意,位在最後。基本上,ArraySpeciesCreate
使用原始數組的constructor
屬性來構建新陣列。