copyWithin 是 ES6 新增的数组原地复制方法,不创建新数组,支持重叠区域复制,语法为 arr.copyWithin(target, start, end),所有参数支持负数索引,按 arr.length + 负值计算。

copyWithin 是 ES6 新增的数组原地复制方法,它不会创建新数组,而是在当前数组内部将一段元素复制到另一段位置,实现“就地覆盖替换”。
核心行为:从源区域复制,覆盖目标区域
它不改变数组长度,只修改指定索引范围内的值。语法为:
arr.copyWithin(target, start, end)- target:开始被覆盖的位置(起始索引,可为负数)
- start:要复制的起始位置(包含,可为负数)
- end:要复制的结束位置(不包含,默认为 arr.length,可为负数)
关键细节:重叠复制完全支持
这是它和 slice + splice 的本质区别——允许 source 和 target 区域重叠,且按从左到右顺序逐个赋值,不会因中间覆盖导致“污染”。例如:
[1,2,3,4,5].copyWithin(0, 3); // → [4,5,3,4,5]- target = 0,start = 3,end = 5(默认),即把索引 3~4 的 [4,5] 复制到从索引 0 开始的位置
- 先 arr[0] = arr[3] = 4,再 arr[1] = arr[4] = 5 —— 原来的 1、2 被覆盖,但不影响后续读取
负数索引:统一按 arr.length + 负值处理
所有参数都支持负数,计算方式一致:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
[-2, -1, 0, 1, 2].copyWithin(-3, -2, -1); // → [-2, -1, 0, 1, 0]- target = -3 → 实际 5 + (-3) = 2
- start = -2 → 实际 5 + (-2) = 3;end = -1 → 实际 5 + (-1) = 4
- 即把索引 3 的值(1)复制到索引 2 的位置 → 第三位变成 1?不对,原数组索引 3 是 1,但上面例子结果末尾是 0 —— 再核对:原数组 [-2,-1,0,1,2],索引 3 是 1,索引 4 是 2;end=-1 即不包含索引 4,所以只取 [1];复制到索引 2 → [-2,-1,1,1,2]?但示例写的是 [...,0],说明示例有误。正确应为:[-2,-1,0,1,2].copyWithin(-3,-2,-1) → target=2,start=3,end=4 → 把 arr[3]=1 赋给 arr[2] → 结果为 [-2,-1,1,1,2]
- 实践中建议用正数或打印 arr.length + n 明确位置,避免歧义
常见用途:模拟循环移位、填充重复段
无需额外空间即可完成高效操作:
- 向左循环移动 2 位:arr.copyWithin(0, 2); arr.splice(-2)(配合截断)
- 用前 N 项填充后 N 项:arr.copyWithin(arr.length - N, 0, N)
- 重复扩展某段(如双倍前3个):arr.push(...arr.slice(0,3)); 是新建,而 arr.copyWithin(arr.length, 0, 3) 可在已预留长度的数组上原地填(需提前扩容)
它不是深拷贝,只复制引用值;也不触发 setter 或 proxy trap(纯底层内存搬运)。用对场景时,比 slice+splice 更简洁、更省内存。

















