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
有两件事:
它会修改您调用它的数组,并且
它会创建一个new数组,其中包含您删除的所有条目
ArraySpeciesCreate
,因此使用子类数组,您可以返回子类的实例:
class CustomArray extends Array {
}
const main = new CustomArray("a", "b", "c", "d");
const 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
属性来构建新数组。 (这是在正常情况下。实际上稍微复杂一些,涉及构造函数上的 Symbol.species
[又名 @@species
] 属性,但这与这里无关。)