,

怎样快速清空大数组

一、arr.length = 0 清空数组原理 1. JS 数组本质:特殊对象,length 是可读写属性 J…

一、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

二、为什么清理大数组效率高?

  1. 引擎批量回收索引映射 V8(Chrome/Node)对数组数字索引做统一管理,修改 length 会一次性截断所有高于长度的 key,不用循环遍历每个元素;
  2. 原地操作无新对象分配 arr = [] 会创建新数组实例,旧大数组等待 GC 垃圾回收; length=0 直接复用原数组内存空间,仅清空元素引用,无额外内存开销;
  3. 元素引用直接切断,GC 更快释放数据 所有元素的引用关系被一次性断开,垃圾回收可以快速回收数组内存储的大对象、大数据。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

About the Author

每个人都有自己得时区,在自己得时区里,一切都是准时的。

BlockSpare — News, Magazine and Blog Addons for (Gutenberg) Block Editor