js清空数组有哪些方法

36 阅读3分钟

好的,清空 JavaScript 数组有多种方法,它们各有特点和细微差别。选择哪种方法取决于你的具体场景(例如,是否要避免内存泄漏、是否有其他引用等)。

以下是清空数组的几种主要方法:


方法概览

方法说明是否影响原数组是否影响其他引用
1. 设置 length = 0最快、最明确
2. 重新赋值 []干净利落
3. 使用 splice()功能性强
4. 使用 while(array.length) + pop()/shift()性能极差

方法详解与示例

1. 设置 length 为 0 (推荐 ★★★)

这是最直接、高效且明确的方法。

let arr = [1, 2, 3, 4, 5];
arr.length = 0; // 直接修改原数组,将其长度截断为0

console.log(arr); // 输出: []
  • 优点:

    • 性能最好
    • 意图非常明确,代码可读性高。
    • 立刻清空原数组。
  • 缺点:

    • 影响所有指向该数组的引用
    let arr1 = [1, 2, 3];
    let arr2 = arr1; // arr2 和 arr1 指向同一个数组
    
    arr1.length = 0; // 通过任一引用清空
    
    console.log(arr1); // []
    console.log(arr2); // [] (arr2 也被清空了)
    

2. 重新赋值为空数组 [] (推荐 ★★★)

这是非常常见且直观的方法。

let arr = [1, 2, 3, 4, 5];
arr = []; // 让变量 arr 指向一个全新的空数组

console.log(arr); // 输出: []
  • 优点:

    • 代码非常简洁易懂
    • 不会影响其他指向原数组的引用。这是它与方法1最大的区别。
    let arr1 = [1, 2, 3];
    let arr2 = arr1; // arr2 和 arr1 指向同一个数组
    
    arr1 = []; // 让 arr1 指向一个新数组
    
    console.log(arr1); // [] (arr1 现在是新的空数组)
    console.log(arr2); // [1, 2, 3] (arr2 仍然指向原来的数组,未被清空)
    
  • 缺点:

    • 严格来说,它不是“清空”原数组,而是创建了一个新数组并让变量指向它。原来的数组如果还有其他引用,则不会被垃圾回收。
    • 如果变量是用 const 声明的,则无法使用此方法。
    const arr = [1, 2, 3];
    arr = []; // TypeError: Assignment to constant variable.
    // 这种情况下只能用 arr.length = 0 或 arr.splice(0)
    

3. 使用 splice() 方法

splice() 方法用于从数组中添加或删除项目,利用它可以从第0位开始删除所有元素。

let arr = [1, 2, 3, 4, 5];
arr.splice(0, arr.length); // 从索引0开始,删除长度为数组当前长度的元素

console.log(arr); // 输出: []
  • 优点:
    • 意图清晰,直接操作原数组。
    • 会返回被删除的元素(虽然清空时我们通常不关心)。
  • 缺点:
    • 性能稍逊于 arr.length = 0(但通常可忽略不计)。
    • 和方法1一样,会影响所有指向该数组的引用

不推荐的方法(仅作了解)

4. 循环移除(性能极差)

通过循环 pop()shift() 直到数组为空。这两种方法性能非常低下,因为每次操作都需要重新计算数组的索引和长度,绝对不要在生产代码中使用。

// 方法A: 循环 pop() (从尾部移除)
let arr = [1, 2, 3, 4, 5];
while (arr.length) {
  arr.pop();
}

// 方法B: 循环 shift() (从头部移除,更慢!)
let arr = [1, 2, 3, 4, 5];
while (arr.length) {
  arr.shift();
}
  • 缺点:
    • 时间复杂度高(O(n)),尤其是 shift(),需要移动所有元素的索引。
    • 代码冗长,目的不明确。

总结与最佳实践

场景推荐方法原因
大多数情况arr.length = 0性能最佳,意图明确,是清空数组的标准做法
需要保留其他引用指向的原数组内容时arr = []不会影响其他引用,让你可以“单独”清空某个变量指向的数组。
变量由 const 声明时arr.length = 0arr.splice(0)无法对 const 变量进行重新赋值。
任何时候都不要用while + pop()/shift()性能极差,是错误的使用方式。

最终建议:arr.length = 0 作为你的默认首选方法,除非你有非常明确的理由需要使用 arr = []