JavaScript数组的length属性可写,设为0可直接截断清空原数组,保持引用不变;字符串length只读,赋值无效;该特性源于规范定义,性能高且适用于响应式场景。

JavaScript 中数组的 length 属性是可写的,这是它和字符串、类数组对象等的关键区别。正因如此,才能用 arr.length = 0 这种方式直接清空原数组——不是创建新数组,而是真正“截断”原有数据。
怎么确认 length 是可写的?
最直接的方式是动手试:给一个数组的 length 赋一个更小的值,看是否生效。
- 执行
let arr = [1, 2, 3, 4]; arr.length = 2;后,arr变成[1, 2] - 再执行
arr.length = 0;,arr立即变成[],且arr.length === 0为真 - 对比字符串:
let str = "abc"; str.length = 0;不会改变str,仍为"abc"(字符串 length 是只读属性)
为什么能靠 length 清空数组?
因为 JavaScript 规范明确将数组的 length 定义为 可写的数据属性。当把 length 设为比当前小的数时,引擎会自动删除索引 ≥ 新长度的所有元素。
-
arr.length = 0→ 所有索引(0、1、2…)都 ≥ 0,全部被删 - 这个过程不涉及循环或迭代,底层是直接重置内部元素表,所以性能高
- 所有指向该数组的变量(如
let b = arr;)看到的仍是同一个被清空的数组
length 清空 vs 其他清空方式的区别
关键差异在于是否保留原数组引用:
-
arr.length = 0和arr.splice(0, arr.length):修改原数组,外部引用同步更新 -
arr = []:让arr指向一个全新空数组,其他引用(如let b = arr;)仍指向旧数组,不会变 - 若需响应式更新(如 Vue/React 的依赖追踪)、或存在多处共享引用,必须选前两种
实际使用建议
优先用 arr.length = 0,除非有明确理由不用:
- ✅ 简洁、高效、语义清晰(“我要清空这个数组”,不是“换一个空数组”)
- ✅ 不产生新对象,减少 GC 压力,尤其适合高频操作(如动画帧、事件回调中)
- ⚠️ 注意:若数组被冻结(
Object.freeze(arr)),length将不可写,赋值无效 - ⚠️ 某些 Proxy 或自定义类数组对象可能重写了
length行为,需单独验证

















