copywithin 是数组原地移动元素的方法,不新建数组、不分配内存,适用于滑动窗口、环形缓冲区等场景;支持左移压缩、右移预留、循环位移及负索引操作,自动处理重叠拷贝。

copyWithin 是数组里少有的真正“原地移动”元素的方法,它不新建数组、不触发内存分配,只在已有内存空间内重新排布数据。这种特性让它特别适合需要频繁调整局部位置的场景,比如滑动窗口、环形缓冲区、队列模拟等。
左移压缩:快速腾出头部空间
当你要逻辑上“删除”前几个元素(如队列出队),用 copyWithin 比 splice(0, n) 更轻量:
- 调用
arr.copyWithin(0, n),把从索引 n 开始的全部内容复制到开头 - 原数组长度不变,前 n 位被覆盖,后 n 位变成冗余副本
- 若需彻底清理,可接
arr.fill(undefined, arr.length - n)或直接改arr.length -= n
右移预留:为插入腾出前部位置
想在索引 0 或 1 插入新值,又不想用 unshift(会整体移动、性能差),可以反向平移:
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 先确保数组有足够容量(如提前
push(undefined)或设好固定长度) - 执行
arr.copyWithin(k, 0, arr.length - k),把前 length−k 个元素移到索引 k 起的位置 - 此时索引 0 到 k−1 空闲,可直接写入新数据
- 必要时用
fill(undefined, 0, 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)把前两个补到末尾 - 更通用做法:分两段复制,先挪后段到前,再挪前段到后,全程只用 copyWithin + fill
- 注意:copyWithin 自动处理重叠,无需担心覆盖顺序——它内部按方向智能选择拷贝路径
负索引简化边界操作
处理末尾数据时,负索引让代码更直观、不易算错:
-
arr.copyWithin(0, -3)→ 把最后 3 个元素移到开头 -
arr.copyWithin(-4, 1, 4)→ 把索引 1~3 的三个元素复制到倒数第 4 位起 - 所有负值会自动转为正索引(如
-1→arr.length - 1),越界则截断,不报错










