如何在JavaScript中清空數組?

有沒有一種方法能夠清空數組,若是能夠的話,可使用.remove()嗎? 數組

例如, jsp

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

我該如何清空? 函數


#1樓

清除現有數組A性能

方法1 測試

(這是我對問題的原始回答) this

A = [];

此代碼會將變量A設置爲新的空數組。 若是您在其餘任何地方都沒有引用原始數組A則這是完美的選擇,由於這實際上會建立一個全新的(空)數組。 您應謹慎使用此方法,由於若是您從另外一個變量或屬性引用了此數組,則原始數組將保持不變。 僅當僅經過其原始變量A引用該數組時,才使用它。 spa

這也是最快的解決方案。 prototype

此代碼示例顯示使用此方法時可能遇到的問題: code

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 (由Anthony 建議

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)。


這一直是一個熱門話題,而且引發了不少爭議。 實際上有許多正確答案,而且因爲很長一段時間以來該答案都已被標記爲可接受答案,所以我將在此處介紹全部方法。 若是您對此答案投同意票,請同時投票同意我引用的其餘答案。


#2樓

若是您須要保留原始數組,由於還有其餘引用也須要更新,則能夠經過將其長度設置爲零來清除它而無需建立新數組:

A.length = 0;

#3樓

您能夠將其添加到JavaScript文件中,以「清除」數組:

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

而後,您能夠像這樣使用它:

var list = [1, 2, 3];
list.clear();

或者,若是您想確保本身不破壞某些東西:

if (!Array.prototype.clear) {
    Array.prototype.clear = function() {
       this.splice(0, this.length);
    };
}

不少人認爲您不該該修改本機對象(例如Array),我傾向於贊成。 請謹慎決定如何處理此問題。


#4樓

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

並稱之爲: array.clear();


#5樓

這裏是最快的實現,同時保留了相同的數組 (「可變」):

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

僅供參考,它不能簡化爲while (array.pop()) :測試將失敗。

FYI MapSet定義clear() ,對於Array也具備clear()彷佛是合乎邏輯的。

TypeScript版本:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

相應的測試:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    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

相關文章
相關標籤/搜索