有什么办法来空数组中,然后如果因此可能与.remove()?

例如,

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

如何清空的?

2009-08-05 09:08:39
问题评论:

感谢为 Phillipe Leybaert 更新其应答以响应 (请参阅下面他更新的答案)。

回答:

方法清除现有数组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。一些指出,这可能无法在所有实现的 JavaScript,但是事实证明这不是这种情况。"严格模式"使用 ECMAScript 5 中,因为数组的 length 属性为读/写属性时也适用。

方法 3(根据建议)

A.splice(0,A.length)

使用.splice()将顺利,但因为.splice()函数会返回包含所有已删除的项的数组,它实际上将返回原始数组的副本。准则建议这有任何的性能没有影响。

方法 4(根据建议tanguy_k)

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

此解决方案不是非常的简洁,和它也是最慢的解决方案,与早期原始的答案中所引用的基准测试。

性能

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

下面的回答中指出由Diadistis ,被缺陷的原始基准测试用于确定上文所述的四种方法的性能。原始基准重新使用已清除的阵列,所以第二个迭代已清除已空的数组。

修复了该缺陷,下面的准则︰ http://jsperf.com/array-destroy/151它清楚地显示方法 (length 属性) 的 #2 和 #3 (接头) 是最快 (不计不会更改原始数组的方法 #1)。


这一直是一个热门话题,许多争议性的原因。实际上很多正确答案,这答案已标记为已接受答案很长时间,因为我将包括所有这里的方法。如果您对此答案进行投票,请 upvote 我也引用其他答案。

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

> 0为可读性更好的 IMHO。还有两个之间没有性能差异。

@daghan 您的观点吗?

@daghan,这也就是根本不是要说。b保存旧数组引用甚至之后a被分配一个新。cd继续引用同一个阵列。因此预计在输出中的差别。

在数组中的项是 falsey 的情况下,不能使用while(A.pop())例如 A = [2,1,0,-1,-2] 采用将导致相加 [2,1]。甚至while(A.pop() !== undefined)并不起作用,因为可以有一个包含数组未定义的值之一。可能原因编译器不优化它。

如果您需要保留原始数组,因为您对它应更新过的其他引用,您可以清除它而不创建一个新数组,将其长度设置为零︰

A.length = 0;

@Acorn 是,它将运行在所有浏览器中。

做什么 ECMAScript 5 标准说一下吗?

@Pacerier︰ 它仍然在 ES5 工作。从 15.4 节:"..whenever 长度属性已更改,将自动删除其名称是其值不小于新长度数组索引的每个属性"

在严格模式下 @LosManos 偶数,length是一个特殊的属性,但不是只读的因此它仍然有效。

@MattewCrumley 我做一些测试和看起来是 a.length = 0 不是有效地清除整个数组。jsperf.com/length-equal-0-or-new-array我认为如果有一个可以参考 (并没有添加您想要保留的额外属性),则最好创建新数组,和适当的垃圾回收器,将运行时旧的叶子。

这里快工作实现同时保持同一阵列:

Array.prototype.clear = function() {
  while (this.length) {
    this.pop();
  }
};

FYI映射定义clear() ,因此看起来太阵列具有clear()的逻辑。

或为Underscore.js mixin:

_.mixin({
  clearArray: function(array) {
    while (array.length) {
      array.pop();
    }
  }
});

它不能简化为 FYIwhile (array.pop())︰ 这些测试将失败。

并会随之移动的测试︰

describe('Array', function() {
  it('should clear the array', function() {
    var array = [1, 2, 3, 4, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);

    // Even with undefined or null inside
    array = [1, undefined, 3, null, 5];
    array.clear();
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

这里更新 jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152

TT 您的答案是仅有的一个更正和快速的 (同时) 但有一些要少得多"upvotes"。嗯,似乎人们喜欢漂亮:/ 速度很慢的解决方案

@thefourtheye 很好的解决方案的性能,虽然我同意 @naomik,您不应修改本机对象。说它应该存在是题外话,问题是要修改全局变量,它坏。如果您提供的供其他人使用您的代码,它应具有任何不可预见的副作用。设想一下,是否另一个库修改Array.prototype和它的操作略有不同,然后在[].clear()您的代码只是稍有错误。这不是调试的乐趣。因此,一般的消息都是︰ 不能修改全局变量。

@thefourtheye 不修改全局作用域的整个点是因为不知道是否已经是别人的代码 (或会) 使用的名称。我建议在局部范围内的函数。这样,在您的应用程序库的IIFE,执行function clear(arr) { while(arr.length) arr.pop(); },然后清除数组而不是arr.clear() clear(arr) /.

我不能相信这是最快的方法。如何灾难可能会出现这种最快的方法 !

事实证明这方法是远低于.splice().length=0基准测试都不正确。请参阅我更新的答案。

更跨浏览器友好和更好的解决方案是使用splice方法清空一个数组如下所示的内容︰

A.splice(0, A.length);

为什么是这更多的跨浏览器友好呢?什么浏览器有 A.length 的问题?

@jm2 您说话的内容并非完全如此。它实际上修改问题中的数组并随后会受到影响的所有引用。在我的 jsFiddle 上看到测试︰ jsfiddle.net/shamasis/dG4PH

@alex 没有 it 不,splice修改数组并返回已删除的条目。请先阅读这些文档︰ developer.mozilla.org/en-US/docs/JavaScript/Reference/...

我们无法防止使用逗号运算符返回结果数组︰ A.splice(0, A.length),0;这样会导致返回值0一样A.length = 0;会。结果数组则仍将创建并导致脚本运行得更慢: (jsperf ~ 56%速度较慢)。虽然我看到的无端为什么splice是设置length比浏览器实现将影响此.

splice也是极为缓慢,相比其他方法jsperf.com/array-splice-vs-array-length-0/2

性能测试︰

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

添加百分比更改,不会不还注意您的平台的情况下很有用。我的计算机上弹出才中铬 34 略非常快,但实际上低于 [] 在最新的 Firefox。

在 Firefox 39.0 32 位 Windows NT 6.3 64 位上测试 = [] 是快 !

当然,创建新的数组实例是比循环和弹出...因此,如果弹出快中铬表示创建数组创建新的速度更快是错误

有的确是一个 fishy Chrome 在此测试结果中。如何在灾难可以爆循环是快得多,然后其他 3 解决方案?

内容来源于Stack Overflow How do I empty an array in JavaScript?
请输入您的翻译

How do I empty an array in JavaScript?

确认取消