Array.prototype.toSpliced()

基线 2023

新功能

2023 年 7 月起,此功能在最新的设备和浏览器版本中均有效。此功能可能在较旧的设备或浏览器中无法正常工作。

toSpliced() 方法是 Array 实例的 复制 版本的 splice() 方法。它返回一个新数组,其中在给定索引处删除和/或替换了一些元素。

语法

js
toSpliced(start)
toSpliced(start, deleteCount)
toSpliced(start, deleteCount, item1)
toSpliced(start, deleteCount, item1, item2)
toSpliced(start, deleteCount, item1, item2, /* …, */ itemN)

参数

start

开始更改数组的零基索引,转换为整数

  • 负索引从数组末尾开始倒数 - 如果 -array.length <= start < 0,则使用 start + array.length
  • 如果 start < -array.lengthstart 被省略,则使用 0
  • 如果 start >= array.length,则不会删除任何元素,但该方法将作为添加函数,添加尽可能多的元素。
deleteCount 可选

一个整数,表示要从 start 位置开始删除的数组中元素的数量。

如果 deleteCount 被省略,或者其值大于或等于 start 指定位置之后的元素数量,那么将删除从 start 到数组末尾的所有元素。但是,如果您希望传递任何 itemN 参数,您应该传递 Infinity 作为 deleteCount 以删除 start 之后的所有元素,因为显式 undefined 会被转换为 0

如果 deleteCount0 或负数,则不会删除任何元素。在这种情况下,您应该指定至少一个新元素(见下文)。

item1,…,itemN 可选

要添加到数组的元素,从 start 开始。

如果您没有指定任何元素,toSpliced() 将只从数组中删除元素。

返回值

一个新数组,它包含 start 之前的全部元素,item1item2,…,itemN,以及 start + deleteCount 之后的全部元素。

描述

toSpliced() 方法与 splice() 方法类似,可以一次执行多个操作:它从数组中删除给定数量的元素,从给定索引开始,然后在相同的索引处插入给定的元素。但是,它返回一个新数组,而不是修改原始数组。因此,已删除的元素不会从此方法中返回。

toSpliced() 方法永远不会生成 稀疏数组。如果源数组是稀疏的,则新数组中的空插槽将被 undefined 替换。

toSpliced() 方法是 泛型 的。它只期望 this 值具有 length 属性和整数键属性。

示例

删除、添加和替换元素

您可以使用 toSpliced() 来删除、添加和替换数组中的元素,并比使用 slice()concat() 更有效地创建新数组。

js
const months = ["Jan", "Mar", "Apr", "May"];

// Inserting an element at index 1
const months2 = months.toSpliced(1, 0, "Feb");
console.log(months2); // ["Jan", "Feb", "Mar", "Apr", "May"]

// Deleting two elements starting from index 2
const months3 = months2.toSpliced(2, 2);
console.log(months3); // ["Jan", "Feb", "May"]

// Replacing one element at index 1 with two new elements
const months4 = months3.toSpliced(1, 1, "Feb", "Mar");
console.log(months4); // ["Jan", "Feb", "Mar", "May"]

// Original array is not modified
console.log(months); // ["Jan", "Mar", "Apr", "May"]

在稀疏数组上使用 toSpliced()

toSpliced() 方法总是创建密集数组。

js
const arr = [1, , 3, 4, , 6];
console.log(arr.toSpliced(1, 2)); // [1, 4, undefined, 6]

在非数组对象上调用 toSpliced()

toSpliced() 方法读取 thislength 属性。然后它读取所需的整数键属性,并将它们写入新数组。

js
const arrayLike = {
  length: 3,
  unrelated: "foo",
  0: 5,
  2: 4,
};
console.log(Array.prototype.toSpliced.call(arrayLike, 0, 1, 2, 3));
// [2, 3, undefined, 4]

规范

规范
ECMAScript 语言规范
# sec-array.prototype.tospliced

浏览器兼容性

BCD 表格只在浏览器中加载

另请参阅