copywithin 是数组内部精准位移引擎,不新建数组、不改长度,仅原地重排数据;参数 target 为落点起始索引,[start, end) 左闭右开,负索引从末尾计,重叠时自动按方向拷贝。

copyWithin 不是“复制粘贴”式的搬运工,而是数组内部的精准位移引擎。它不新建数组、不分配内存,只在已有空间里重新排布数据,所有操作都在原数组上完成,长度始终不变。
参数逻辑:目标位置决定落点,不是腾空位
target 是元素要“贴上去”的起始索引,不是你希望“挪开”的位置。比如想把后两个元素移到开头,arr.copyWithin(0, -2) 就够了——4 和 5 直接覆盖前两位,不需要先删、再插、再移。
start 和 end 构成左闭右开区间 [start, end),省略 end 就默认复制到末尾;负索引直接从末尾算起,-1 是最后一个,-3 是倒数第三个。
- target 超出范围(如 100)不报错,但无效
- start ≥ end(如 copyWithin(0, 3, 1))什么也不做
- 源与目标重叠时,内部自动按方向选择拷贝路径:前移从左往右,后移从右往左
左移压缩:高效模拟出队
逻辑删除前 n 个元素,比 splice(0, n) 更轻量。调用 arr.copyWithin(0, n),后面的内容直接往前盖住前面,数组长度不变,前 n 位被新值覆盖。
若需真正缩短数组,补一句 arr.length -= n 即可;若要清空冗余尾部,可用 arr.fill(undefined, arr.length - n)。
右移预留:避免 unshift 的整体搬移
想在开头插入新值又怕 unshift 拖慢性能?先扩容:arr.length += k,再用 arr.copyWithin(k, 0, arr.length - k) 把原内容整体右推 k 位,最后用 arr.fill(0, 0, k) 填充空出的前 k 位。
这个组合不依赖临时数组,全程原地,适合高频写入场景,比如日志缓冲或滑动窗口更新。
循环位移:两步到位,不用拼接
让 [1,2,3,4,5] 左旋 2 位变成 [3,4,5,1,2],只需两步:
- arr.copyWithin(0, 2) → [3,4,5,4,5]
- arr.copyWithin(3, 0, 2) → [3,4,5,1,2]
右旋同理,用负索引更直观:arr.copyWithin(-2, 0) 把开头两个搬到末尾,一步完成部分循环移动。
它不深拷贝、不改长度、不抛异常,但会真实修改原数组。用之前心里得有数——这不是函数式操作,而是内存级的直接调度。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











