有没有方法清空数组,如果有可能,可以使用.remove()?

例如,

A = [1,2,3,4];

我怎么才能把它清空?


当前回答

清除现有阵列A的方法:

方法1

(这是我对问题的最初回答)

A = [];

此代码将变量A设置为新的空数组。如果在其他任何地方都没有对原始数组A的引用,这是完美的,因为这实际上创建了一个全新的(空)数组。您应该小心使用此方法,因为如果您从另一个变量或属性引用了此数组,则原始数组将保持不变。仅当仅通过原始变量A引用数组时,才使用此选项。

这也是最快的解决方案。

此代码示例显示了使用此方法时可能遇到的问题:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

方法2(Matthew Crumley建议)

A.length = 0

这将通过将其长度设置为0来清除现有数组。当在ECMAScript 5中使用“严格模式”时,它也可以工作,因为数组的长度属性是读/写属性。

方法3(安东尼建议)

A.splice(0,A.length)

使用.splice()可以很好地工作,但由于.splice()函数将返回一个包含所有移除项的数组,因此它实际上将返回原始数组的副本。基准表明,这对绩效没有任何影响。

方法4(由tanguy_k建议)

while(A.length > 0) {
    A.pop();
}

这个解决方案不是很简洁,也是最慢的解决方案,与原始答案中引用的早期基准相反。

表演

在清除现有数组的所有方法中,方法2和3的性能非常相似,比方法4快得多。请参阅此基准。

正如Diadistis在下面的回答中指出的,用于确定上述四种方法性能的原始基准存在缺陷。原始基准测试重用了已清除的数组,因此第二次迭代正在清除已为空的数组。

以下基准测试修复了此缺陷:http://jsben.ch/#/hyj65.它清楚地表明,方法#2(长度属性)和#3(拼接)是最快的(不包括方法#1,它不会改变原始数组)。


这一直是一个热门话题,引起了很多争议。实际上有很多正确的答案,因为这个答案已经被标记为公认答案很长一段时间了,我将在这里包括所有的方法。

其他回答

性能测试:

http://jsperf.com/array-clear-methods/3

a = []; // 37% slower
a.length = 0; // 89% slower
a.splice(0, a.length)  // 97% slower
while (a.length > 0) {
    a.pop();
} // Fastest

A.拼接(0);

我只是在我正在研究的一些代码上做了这个。它清除了数组。

如果您对内存分配感兴趣,可以使用jsfiddle这样的东西与chrome开发工具的时间线选项卡来比较每种方法。您将希望在“清除”阵列后使用底部的垃圾箱图标强制垃圾收集。这将为您选择的浏览器提供更明确的答案。这里的很多答案都是旧的,我不会依赖它们,而是像上面@tanguy_k的答案那样进行测试。

(有关上述选项卡的介绍,您可以在此处查看)

Stackoverflow迫使我复制jsfiddle,所以这里是:

<html>
<script>
var size = 1000*100
window.onload = function() {
  document.getElementById("quantifier").value = size
}

function scaffold()
{
  console.log("processing Scaffold...");
  a = new Array
}
function start()
{
  size = document.getElementById("quantifier").value
  console.log("Starting... quantifier is " + size);
  console.log("starting test")
  for (i=0; i<size; i++){
    a[i]="something"
  }
  console.log("done...")
}

function tearDown()
{
  console.log("processing teardown");
  a.length=0
}

</script>
<body>
    <span style="color:green;">Quantifier:</span>
    <input id="quantifier" style="color:green;" type="text"></input>
    <button onclick="scaffold()">Scaffold</button>
    <button onclick="start()">Start</button>
    <button onclick="tearDown()">Clean</button>
    <br/>
</body>
</html>

您应该注意,这可能取决于数组元素的类型,因为javascript管理字符串的方式不同于其他基本类型,更不用说对象数组了。类型可能会影响发生的情况。

使用Jan最初建议的修改版本:

var originalLength = A.length;
for (var i = originalLength; i > 0; i--) {
     A.pop();
}

Terser公司:

for (let i = A.length; i > 0;A.pop(),i--) {}

或者这里是另一个例子:

while(!A[Symbol.iterator]().next().done)A.shift()

如果您正在使用

a = []; 

然后将新的数组引用分配给,如果中的引用已经分配给任何其他变量,那么它也不会清空该数组,因此垃圾收集器不会收集该内存。

例如。

var a=[1,2,3];
var b=a;
a=[];
console.log(b);// It will print [1,2,3];

or

a.length = 0;

当我们指定a.length时,我们只是重置数组和内存的边界,其余数组元素将由垃圾收集器连接。

而不是这两种解决方案更好。

a.splice(0,a.length)

and

while(a.length > 0) {
    a.pop();
}

根据kenshou.html先前的回答,第二种方法更快。