fill和copywithin均静默处理越界索引但逻辑不同:fill仅对[0, length)内有效范围填充,越界则忽略;copywithin将越界索引截断至合法范围再操作,且支持安全重叠复制。

fill 和 copyWithin 都会静默处理越界索引,不报错、不抛异常,但行为逻辑不同。
fill 的边界溢出表现
当 start 或 end 超出数组有效范围(包括负数过大或正数过大),fill 仅对落在 [0, length) 内的部分执行填充,其余直接忽略。
- start ≥ length 或 start ≤ -length → 无效果(起始位置无效)
- end ≤ 0 或 end ≤ start → 无效果(结束位置无效或范围为空)
- start 有效但 end > length → 只填充到数组末尾
- start 为负数:自动转为 length + start,若结果
copyWithin 的边界溢出表现
copyWithin 对 target、start、end 均做边界截断:所有参数先规范化为实际可用索引(0 到 length 之间),再执行复制。超出部分被自动裁剪,不会越界访问。
- target 超出 [0, length) → 截断为 0 或 length(如 target length → length)
- start length + start,若仍
- end > length → 视为 length;end ≤ start → 复制长度为 0(无操作)
- 复制时,源段与目标段重叠是允许的,且按从左到右或从右到左顺序安全处理(引擎自动保证逻辑正确)
常见静默场景对比
以下操作均不报错,但结果可能不符合直觉:
-
[1,2,3].fill(9, 5, 10)→[1,2,3](start=5 已越界) -
[1,2,3].fill(9, -10, -6)→[1,2,3](-10 和 -6 转为 0 和 -1 → 实际 end ≤ start) -
[1,2,3,4,5].copyWithin(10, 0, 2)→ 目标从索引 10 开始,但数组只有 5 位 → 实际插入位置被截为 length = 5,即不发生写入 -
[1,2,3,4,5].copyWithin(-2, 0, 2)→ target=-2 → 转为 5 + (-2) = 3,从索引 3 开始覆盖 →[1,2,3,1,2]
关键提醒
这两个方法都修改原数组,且不校验索引合法性——这是设计使然,不是 bug。开发时应主动做范围预判,尤其在动态计算索引时,避免依赖“静默”行为掩盖逻辑错误。











