一、arr.length = 0 清空数组原理
1. JS 数组本质:特殊对象,length 是可读写属性
JavaScript 数组不是连续内存块,是键为数字、自带 length 属性的 Object:
const arr = [1,2,3];
// 内部结构近似
{
0: 1,
1: 2,
2: 3,
length: 3
}
规范规定:直接给 length 赋值小于当前长度,会自动删除索引超出 length 的所有元素。
执行 arr.length = 0:
- length 变为 0
- 删除索引
0、1、2...全部键 - 数组变为空
[] - 原数组引用不变(原地修改,不新建数组)
2. 和其他清空方式对比
方式 1:arr.length = 0(原地清空,推荐)
let arr = [1,2,3,4,5];
arr.length = 0;
console.log(arr); // []
// 原数组引用没变,其他地方共用这个数组变量会同步看到空数组
特点:
- 原地操作,不产生新数组、不占用额外堆内存
- 数组引用不变,多处共享同一数组时全部生效
- 超大数组性能极好,引擎底层批量清除索引映射
方式 2:arr = [](赋值空数组,不清理原数组)
let arr = [1,2,3];
arr = [];
只是让变量 arr 指向全新空数组,原来的大数组还留在内存,如果有其他变量引用旧数组,数据完全不会清空:
js
运行
let a = [1,2,3];
let b = a;
a = [];
console.log(b); // [1,2,3] 旧数据还在
方式 3:arr.splice(0)
arr.splice(0);
底层逻辑和 length=0 类似,但 splice 会生成被删除元素的新数组返回,超大数组会额外占用内存,效率低于 length=0。
二、为什么清理大数组效率高?
- 引擎批量回收索引映射 V8(Chrome/Node)对数组数字索引做统一管理,修改
length会一次性截断所有高于长度的 key,不用循环遍历每个元素; - 原地操作无新对象分配
arr = []会创建新数组实例,旧大数组等待 GC 垃圾回收;length=0直接复用原数组内存空间,仅清空元素引用,无额外内存开销; - 元素引用直接切断,GC 更快释放数据 所有元素的引用关系被一次性断开,垃圾回收可以快速回收数组内存储的大对象、大数据。




