LINDORのAdvent Calendar(本物)の2日目を開けたところ。
配列とかおれおれAdvent Calendar2018 – 02日目

JavaScriptの配列のインスタンスを保ったまま中身を全て削除したい場合、 length に 0 を設定するだけで実現できます。

const arr = [11, 22, 33];

arr.length = 0;
console.log(arr); // => []

仕様

length の変更で要素が削除されることについて、配列特殊オブジェクト Array Exotic Objects の項に記載があります。

… whenever the value of the length property is changed, every own property whose name is an array index whose value is not smaller than the new length is deleted. This constraint applies only to own properties of an Array object and is unaffected by length or array index properties that may be inherited from its prototypes.

… length プロパティの値が変更された場合、新しいlengthより小さくない array index をプロパティ名とするすべてのプロパティは削除される。この制約は配列オブジェクト自身のプロパティにのみ適用され、プロトタイプから継承された length や array index からは影響を受けない。

他のやりかた

新しい配列へ置き換える

見た目はわかりやすくてよろしい。

arr = [];

別インスタンスになってしまうので、インスタンスを対象に何かしてる場合は不具合の原因になったりするかも。

空になるまで取り出し続ける

配列から取り除くと同時に何か処理をしなくちゃいけない場合はこう。

const arr = [11, 22, 33];

while (arr.length > 0) {
  const item = arr.pop();
  console.log(item); // 何かする
}

console.log(arr); // => []

pop() は後ろから取り出すので、 33, 22, 11 の順に処理されます。

先頭から 11, 22, 33 と取り出したい場合は shift() が使えます。

ちなみに arr.length > 0 は単に arr.length でも動くけど、意味が明確なのでおれならこっちで書きます。書く手間がかかるわけでもないしね。

ごそっと取り除く

空にする前の要素を別の場所に保管しておきたい場合に。そんな場合があるかはわからないけれど。

const arr = [11, 22, 33];
const removedElement = arr.splice(0, arr.length);
console.log(removedElement); // => [ 11, 22, 33 ]
console.log(arr); // => []

clear() を自前で用意する

prototype を改造するとか、継承して独自クラス作るとか、そういうのも可能ではある。

いずれもあんまり良くなさそう。

おしまい

arr.length = 0 が一番簡単で良いと思います。

参考