2016-11-21 69 views

回答

3

爲什麼需要ArraySpeciesCreate被調用來創建原始數組的一個副本?

不是創建原始數組的副本(更多下面)。

Array.prototype.splice是否直接在原始數組中操作...?

是的。

splice做了兩兩件事:

  1. 它會修改你怎麼稱呼它的陣列,並

  2. 刪除

它創建了一個 數組包含任何條目

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在規範的描述:

的抽象操作ArraySpeciesCreateoriginalArray長度用於使用從originalArray衍生的構造函數,以指定一個新的Array對象的創建參數。

請注意,位在最後。基本上,ArraySpeciesCreate使用原始數組的constructor屬性來構建新陣列。

相關問題