天天看點

splice方法_JS清空數組的方法和後果

方法1:将

length

數組的屬性設定為值0(零)。

這種簡單的方式就像:

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

請注意,從陣列中删除一個/少數(或特定)元素并完全清空它(全部删除)的用例是不同的。是以,需要對它們進行不同的思考。

這些方法中的每一種都有其自身的後果(優點和缺點)和使用範圍/時間。另一點需要注意的是,在确定實施方法時,性能也是關鍵。