为什么在Array.prototype.splice中调用ArraySpeciesCreate?

问题描述 投票:0回答:1

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
javascript ecmascript-6
1个回答
4
投票

为什么需要调用ArraySpeciesCreate来创建原始数组的副本?

不会创建原始数组的副本(更多内容见下文)。

Array.prototype.splice
是直接在原数组中操作吗...?

是的。

splice
有两件事:

  1. 它会修改您调用它的数组,并且

  2. 它会创建一个new数组,其中包含您删除的所有条目

由于 #2 而使用

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
] 属性,但这与这里无关。)

© www.soinside.com 2019 - 2024. All rights reserved.