方法1:将 length
數組的屬性設定為值0(零)。
length
這種簡單的方式就像:
const arr = [ 1, 2, 3, 4, 5 ];
arr.length = 0;
後果
這種方式不會改變原始數組引用。這意味着,如果您将一個數組引用配置設定給具有指派運算符(=)的其他數組,則在一個數組上應用此方法也将清除另一個數組。
記住,數組是非原始的。如果我們為變量指派非原始值,那麼該變量實際上不包含該值,而是儲存引用。讓我們通過一個例子更好地了解它:
const myArray = [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
];
let yourArray = [ 'Some', 'thing' ];
yourArray = myArray;
console.time('Approach 1: .length = 0');
myArray.length = 0;
console.timeEnd('Approach 1: .length = 0');
console.group('Approach 1: Empty array using .length property of the Array')
console.log('myArray =>', myArray);
console.log('yourArray =>', yourArray);
console.groupEnd();
我在這裡做的比預期多一點。我也在計算清空數組所用的時間(以毫秒為機關)。請注意,我将對所有方法做同樣的事情,以便我們也了解性能。
回到輸出:
Approach 1: .length = 0: 0.112ms
Approach 1: Empty array using .length property of the Array
myArray => []
yourArray => []
它說,
- 這種方法花了0.087ms。
- 正如我們看到的,
和myArray
現在清空。yourArray
學習
在上面示範的情況下,如果您對同一個數組有兩個引用,并且您使用了一個數組
arr.length = 0
,則兩個引用現在将指向相同的空數組。
是以學習是,如果你不希望其他數組在這種情況下也是一個空數組,請不要使用這種技術!
方法2:配置設定對新數組的引用
這很簡單:
let arr = [ 1, 2, 3, 4, 5 ];
arr = [];
後果
此方法會改變原始數組引用。它将對空數組的引用配置設定給原始變量。讓我們通過一個例子來了解這一點:
let hisArray = [ 'Some', 'thing' ];
let herArray = [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
];
herArray = hisArray;
console.time('Approach 2: new assignment');
hisArray = [];
console.timeEnd('Approach 2: new assignment');
console.group('Approach 2: Empty array by assigning a new empty Array []')
console.log('hisArray =>', hisArray);
console.log('herArray =>', herArray);
console.groupEnd();
輸出結果如下:
Approach 2: new assignment: 0.005ms
Approach 2: Empty array by assigning a new empty Array []
hisArray => []
herArray => [ 'Some', 'thing' ]
如你所見,
- 這種方法花費的時間比前一次少,即隻需0.005 ms
- 原始數組
已更改,但陣列的其他值hisArray
仍未更改。herArray
學習
僅當您沒有對原始數組的其他引用時,此方法才适用。你應該小心這種方法,因為如果你從另一個變量引用這個數組,原始數組将保持不變。這可能會導緻記憶體洩漏。
是以,學習是,如果您隻通過其原始變量引用數組,請使用此方法。
方法3:使用pop()直到結束
另一種方法可以使用Array的pop()方法來删除元素。那麼當想要删除所有元素時該怎麼辦?是!
pop()
在循環中使用:
let someArray = [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
];
console.time('Approach 3: pop()');
while(someArray.length > 0) {
someArray.pop();
}
console.timeEnd('Approach 3: pop()');
console.group('Approach 3: Use pop until death');
console.log('someArray => ', someArray);
console.groupEnd();
......輸出是:
Approach 3: pop(): 0.012ms
Approach 3: Use pop until death
someArray => []
後果
随着數組中元素數量的增加,這種方法可能會變得很慢。您将發現此方法與之前方法之間存在真正的性能差異,其中Array中的元素數量較多。
學習
如果在處理大型數組時有辦法使用以前的方法,請不要使用此方法。
方法4:使用拼接!
您可以使用
splice
數組上的方法清空數組,它與方法1和方法2一樣友善。但是,它帶有隐藏成本!
let names = [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
];
console.time('Approach 4: splice()');
let spliced = names.splice(0, names.length);
console.timeEnd('Approach 4: splice()');
console.group('Approach 4: Use splice!');
console.log('names => ', names);
console.log('spliced => ', spliced )
console.groupEnd();
仔細檢視輸出:
Approach 4: splice(): 0.005ms
Approach 4: Use splice!
names => []
spliced => [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
]
後果
使用
.splice()
效果很好,性能也很好!但由于該
.splice()
函數将傳回包含所有已删除項的數組,是以它實際上将傳回原始數組的副本。
學習
如果您不必承擔原始數組的傳回副本的開銷,請不要使用此方法。可能有需要它的用例,但我很想聽到這些!
方法5:Shift()怎麼樣?
這是我們的最後一種方法,使用
shift()
方法。怎麼
shift()
辦?
shift()方法從數組中删除第一個元素并傳回已删除的元素。
看看下面的代碼:
let againNames = [ 'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info', ' ',
'blog', 'dot', 'green', 'roots', 'dot', 'info'
];
console.time('Approach 5: shift()');
while (againNames.length > 0) {
againNames.shift();
}
console.timeEnd('Approach 5: shift()');
console.group('Approach 5: How about Shift()?');
console.log('againNames', againNames);
console.groupEnd();
......和輸出:
Approach 5: shift(): 0.027ms
Approach 5: How about Shift()?
againNames []
後果/學習
當上面描述了其他更好的方法時,使用它會更慢并且沒有多大意義。
結論
在我的日常代碼審查中,我已經看到方法#1和2的使用大量用于清空陣列,
- 用法
.length()
- 配置設定
new Array
請注意,從陣列中删除一個/少數(或特定)元素并完全清空它(全部删除)的用例是不同的。是以,需要對它們進行不同的思考。
這些方法中的每一種都有其自身的後果(優點和缺點)和使用範圍/時間。另一點需要注意的是,在确定實施方法時,性能也是關鍵。