众所周知在JS中数组和对象都是引用类型,直接比较是会比较地址的位置是否相同,所以如果想保证地址不变,以下有两种情况。

一、会改变数组地址的方式

直接重新赋值为 [ ]:

  1. let a = [1,2,3]
  2. console.log(a) //[1,2,3]
  3. a = []
  4. console.log(a) //[]

这里其实并不能说是严格意义的清空数组,只是将ary重新赋值为空数组,之前的数组如果没有引用在指向它将等待垃圾回收。

二、不会改变地址的方式(第二种非常有意思)

方式1,splice

  1. let ary = [1,2,3,4];
  2. ary.splice(0,ary.length); //表示从第一个开始往后删除length个数据
  3. console.log(ary); // 输出 [],空数组,即被清空了

方式2,length赋值为0

这种方式很有意思,其它语言如Java,其数组的length是只读的,不能被赋值。如

  1. int[] ary = {1,2,3,4};
  2. ary.length = 0; //会报错,Java中的数组长度只读

Java中会报错,编译通不过。而JS中则可以,且将数组清空了,并且由于没有重新赋值,数组的地址也不会改变

  1. let ary = [1,2,3,4];
  2. ary.length = 0;
  3. console.log(ary); // 输出 [],空数组,即被清空了

目前 Prototype中数组的 clear 和mootools库中数组的 empty 使用这种方式清空数组。

虽然如此,经过测试发现,重新赋值数组的效率是最高的,执行事件最短,所以如果不用保留数组的地址和其他属性的话建议使用重新赋值来清空数组,测试代码:

  1. let a = [];
  2. for (let i=0; i< 1000000; i++){
  3. a.push(i);
  4. }
  5. let start = new Date();
  6. //a = [];
  7. a.length = 0;
  8. let end = new Date();
  9. alert(end - start);
  1. let a = [];
  2. for (let i=0; i< 1000000; i++){
  3. a.push(i);
  4. }
  5. let start = new Date();
  6. a = [];
  7. //a.length = 0;
  8. let end = new Date();
  9. alert(end - start);