Array.prototype.copyWithin()
copyWithin()
方法是 Array
实例的浅拷贝方法,它将该数组的一部分浅拷贝到同一数组中的另一个位置,并返回该数组,而不会修改其长度。
试一试
语法
copyWithin(target, start)
copyWithin(target, start, end)
参数
目标
-
要将序列复制到的起始索引(基于零),转换为整数。这对应于
start
处的元素将被复制到的位置,并且start
和end
之间的所有元素都将复制到后续索引。- 负索引从数组末尾开始反向计数 - 如果
-array.length <= target < 0
,则使用target + array.length
。 - 如果
target < -array.length
,则使用0
。 - 如果
target >= array.length
,则不复制任何内容。 - 如果
target
在规范化后位于start
之后,则复制仅发生在array.length
的末尾之前(换句话说,copyWithin()
永远不会扩展数组)。
- 负索引从数组末尾开始反向计数 - 如果
开始
-
要开始复制元素的起始索引(基于零),转换为整数。
- 负索引从数组末尾开始反向计数 - 如果
-array.length <= start < 0
,则使用start + array.length
。 - 如果
start < -array.length
,则使用0
。 - 如果
start >= array.length
,则不复制任何内容。
- 负索引从数组末尾开始反向计数 - 如果
end
可选-
要停止复制元素的结束索引(基于零),转换为整数。
copyWithin()
复制到但不包括end
。- 负索引从数组末尾开始反向计数 - 如果
-array.length <= end < 0
,则使用end + array.length
。 - 如果
end < -array.length
,则使用0
。 - 如果
end >= array.length
或end
被省略,则使用array.length
,导致复制到末尾的所有元素。 - 如果
end
暗示的位置在start
暗示的位置之前或与之相同,则不复制任何内容。
- 负索引从数组末尾开始反向计数 - 如果
返回值
修改后的数组。
描述
copyWithin()
方法的工作原理类似于 C 和 C++ 的 memmove
,是一种用于移动 Array
数据的高性能方法。这尤其适用于同名的 TypedArray
方法。序列被复制粘贴为一个操作;即使复制和粘贴区域重叠,粘贴的序列也将具有复制的值。
因为 undefined
在转换为整数时会变为 0
,所以省略 start
参数的效果与传递 0
相同,这会将整个数组复制到目标位置,相当于右移,其中右侧边界被剪切掉,左侧边界被复制。此行为可能会混淆代码的读者,因此您应该显式地将 0
作为 start
传递。
console.log([1, 2, 3, 4, 5].copyWithin(2));
// [1, 2, 1, 2, 3]; move all elements to the right by 2 positions
copyWithin()
方法是一个 修改方法。它不会更改 this
的长度,但它会更改 this
的内容,并在必要时创建新属性或删除现有属性。
copyWithin()
方法保留空插槽。如果要复制的区域是 稀疏的,则空插槽的对应新索引将被 删除 并也变为空插槽。
copyWithin()
方法是 泛型 的。它只期望 this
值具有 length
属性和整数键属性。尽管字符串也是类似数组的,但此方法不适合应用于它们,因为字符串是不可变的。
示例
使用 copyWithin()
console.log([1, 2, 3, 4, 5].copyWithin(0, 3));
// [4, 5, 3, 4, 5]
console.log([1, 2, 3, 4, 5].copyWithin(0, 3, 4));
// [4, 2, 3, 4, 5]
console.log([1, 2, 3, 4, 5].copyWithin(-2, -3, -1));
// [1, 2, 3, 3, 4]
在稀疏数组上使用 copyWithin()
copyWithin()
将传播空插槽。
console.log([1, , 3].copyWithin(2, 1, 2)); // [1, empty, empty]
在非数组对象上调用 copyWithin()
copyWithin()
方法读取 this
的 length
属性,然后操作涉及的整数索引。
const arrayLike = {
length: 5,
3: 1,
};
console.log(Array.prototype.copyWithin.call(arrayLike, 0, 3));
// { '0': 1, '3': 1, length: 5 }
console.log(Array.prototype.copyWithin.call(arrayLike, 3, 1));
// { '0': 1, length: 5 }
// The '3' property is deleted because the copied source is an empty slot
规范
规范 |
---|
ECMAScript 语言规范 # sec-array.prototype.copywithin |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。