copyWithin 是 JavaScript 数组原生方法,用于在当前数组内部复制元素并粘贴到指定位置,不改变长度,只原地覆盖;参数 target、start、end 均支持负数索引,自动规范化,操作安全且返回原数组。

copyWithin 是 JavaScript 数组的原生方法,用于**在当前数组内部复制一段元素,并粘贴到指定位置**,不改变数组长度,也不新增或删除元素,只做“原地覆盖”。关键在于理解它的三个参数:目标起始位置、源起始位置、源结束位置(可选)。
参数含义与基本用法
语法:arr.copyWithin(target, start, end)
- target:复制后要填入的起始索引(从哪开始覆盖,可为负数)
- start:要复制的元素起始索引(包含,可为负数)
- end:要复制的元素结束索引(不包含,可为负数;省略时默认到数组末尾)
注意:所有索引都会被自动规范化(超出范围会截断),且操作是“先读再写”,不会因覆盖导致读取错误。
常见使用场景示例
把后半段复制到前半段:
let arr = [1, 2, 3, 4, 5]; arr.copyWithin(0, 2); // 从索引2开始复制到开头 → [3, 4, 5, 4, 5]
向右平移两个位置(类似“滚动”):
let arr = [1, 2, 3, 4, 5]; arr.copyWithin(2, 0, 3); // 把[0,3)即[1,2,3]复制到索引2起 → [1, 2, 1, 2, 3]
使用负索引(从末尾计数):
let arr = [10, 20, 30, 40, 50]; arr.copyWithin(-2, -4, -1); // target=-2→索引3,start=-4→索引1,end=-1→索引4 → 复制[20,30,40]到位置3起 → [10, 20, 30, 20, 30]
容易忽略的关键细节
- 复制和粘贴区域可以重叠,方法内部会先提取源数据再写入目标,所以安全
- 如果
target > start(比如向右复制),实际是“先拷贝再覆盖”,不会因中间覆盖影响源内容 - 索引超出范围会被自动修正:小于 0 的按
length + index计算,大于length的按length截断 - 该方法返回修改后的原数组(链式调用可用),但不创建新数组
对比 slice + splice 的替代写法
不用 copyWithin 也能实现类似效果,例如:
let arr = [1, 2, 3, 4, 5]; // 想把索引1~3复制到索引0开始 arr.splice(0, 3, ...arr.slice(1, 4)); // [2, 3, 4, 4, 5]
但这样会改变数组长度、触发重新索引,性能和语义都不如 copyWithin 直接、高效、语义清晰。尤其适合实现循环缓冲区、数组旋转等底层操作。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











