清空数组最直接有效的方式是 length = 0,它原地截断、无内存分配、兼容性好,性能通常最优;其他方法在语义、副作用或适用场景上各有差异,需结合实际需求选择。

清空数组最直接有效的方式是 length = 0,它原地截断、无内存分配、兼容性好,性能通常最优。其他方法在语义、副作用或适用场景上各有差异,需结合实际需求选择。
直接设置 length = 0(推荐)
这是标准、高效且无副作用的清空方式。JavaScript 数组的 length 属性是可写的,将其设为 0 会立即移除所有元素,不创建新对象,也不触发 GC 压力。
- 操作原数组,引用保持不变,适合被多处引用的数组
- 时间复杂度 O(1),不遍历元素,不调用任何方法
- 所有浏览器和 Node.js 环境完全支持
let arr = [1, 2, 3, 4];<br>arr.length = 0;<br>console.log(arr); // []
赋值空数组 arr = [](谨慎使用)
这并非“清空”,而是**重新赋值引用**。原数组对象仍存在于内存中(若无其他引用则等待 GC),而变量指向一个全新空数组。
- 若只有该变量引用该数组,效果看似相同,但底层新建了数组对象
- 若其他变量或对象属性也引用原数组(如
let b = arr;),则b不受影响 - 存在轻微内存开销,且在闭包或事件监听器中可能引发意料外行为
length = 0 在响应式系统或共享状态中的作用。
使用 pop() / shift() 循环(不推荐)
通过循环调用 pop() 或 shift() 逐个移除元素,逻辑直观但效率极低。
立即学习“Java免费学习笔记(深入)”;
-
pop()每次删末尾,时间复杂度 O(n),但常数因子较大(多次函数调用+边界检查) -
shift()更慢:每次删除首项都要将后续所有元素前移,整体 O(n²) - 仅适用于必须触发数组变更钩子(如某些 Proxy 实现)的极端场景
while (arr.length) arr.pop(); // 不必要地低效
splice(0) 和 fill() + length 组合(备选)
arr.splice(0) 是标准方法,返回被删元素数组,原数组变为空;arr.fill(undefined).length = 0 则多余且易出错。
-
splice(0)性能接近length = 0,但多一次返回新数组的开销(即使丢弃) -
fill()本身不改变长度,必须配合length = 0才真正清空,纯属画蛇添足 - 除非需要拿到旧元素(如做撤销操作),否则无理由选
splice
splice(0) 可读性略高但稍重;其余方式要么语义不符,要么性能显著更差。



















