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

例如,

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

我怎么才能把它清空?


当前回答

到目前为止,支持票不少于2739票的答案是误导和错误的。

问题是:“如何清空现有阵列?”例如,对于A=[1,2,3,4]。

说“A=[]是答案”是无知的,绝对不正确。[]==[]为假。这是因为这两个阵列是两个独立的对象,具有各自的两种身份,在数字世界中占据各自的空间,各自独立。


假设你妈妈让你清空垃圾桶。

你不会把一个新的带进来,就好像你已经完成了被要求的事情。相反,你倒垃圾桶。你不会用新的空罐替换已填充的罐,也不会从已填充的罐子中取出标签“a”并将其粘贴到新的罐上,如a=[1,2,3,4];A=[];

清空数组对象是有史以来最简单的事情:

A.length = 0;

这样,“A”下的罐子不仅是空的,而且干净如新!


此外,在垃圾桶清空之前,您不需要手动清除垃圾!你被要求一次彻底清空现有的垃圾桶,直到垃圾桶变空后再去捡垃圾,如下所示:而(A长度>0){A.pop();}也不要把你的左手放在垃圾桶的底部,右手放在顶部,这样就可以把垃圾桶里的东西拿出来,如下所示:A.拼接(0,A.长度);

不,你被要求清空它:

A.length = 0;

这是唯一正确清空给定JavaScript数组内容的代码。

其他回答

如果您对内存分配感兴趣,可以使用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管理字符串的方式不同于其他基本类型,更不用说对象数组了。类型可能会影响发生的情况。

使用拼接方法清空数组A的内容是一种更易于跨浏览器且更优化的解决方案,如下所示:

A.拼接(0,A.长度);

您可以轻松地创建一个函数来实现这一点,更改长度,甚至将其作为remove()函数添加到本机Array中以供重用。

假设您有此阵列:

var arr = [1, 2, 3, 4, 5]; //the array

好的,只需运行以下命令:

arr.length = 0; //change the length

结果是:

[] //result

清空数组的简单方法。。。

也可以使用循环,这不是必须的,但只是另一种方法:

/* could be arr.pop() or arr.splice(0)
don't need to return as main array get changed */

function remove(arr) {
  while(arr.length) {
    arr.shift(); 
  }
}

你也可以考虑一些棘手的方法,例如:

arr.splice(0, arr.length); //[]

因此,如果arr有5项,它将从0拼接5项,这意味着数组中不会保留任何内容。

还有其他方法,例如简单地重新分配数组:

arr = []; //[]

如果您查看Array函数,有很多其他方法可以做到这一点,但最推荐的方法可能是更改长度。

正如我在开头所说的,你也可以原型remove(),因为它是你问题的答案。您可以简单地选择上面的方法之一,并将其原型化为JavaScript中的Array对象,例如:

Array.prototype.remove = Array.prototype.remove || function() {
  this.splice(0, this.length);
};

您可以像这样调用它来清空javascript应用程序中的任何数组:

arr.remove(); //[]

如果您使用常量,则您别无选择:

const numbers = [1, 2, 3]

您不能重新设计:

numbers = []

您只能截断:

numbers.length = 0

如果您正在使用

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先前的回答,第二种方法更快。