かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

JavaScript const で作った配列を空にしたい

前回のおさらい

配列は参照

const array = ['シャミ子', 'もも', 'みかん'];
const refArr = array;
array.push('シャミ先');
console.log(refArr);
// => ['シャミ子', 'もも', 'みかん', 'シャミ先']

空配列を代入して配列を空にする方法だと const にできない

配列を空にする方法で一般的なのは 空配列 [] を代入してしまうことではないかと思います。
しかしこの方法では再代入しなければならないので、const 定義することができません。

let array = ['シャミ子', 'もも', 'みかん'];
const refArr = array;
// 配列を空にする
array = [];
console.log(array);
// => []
console.log(refArr);
// => ['シャミ子', 'もも', 'みかん']
// 再代入が発生しているので参照が切れ別の配列になっている

Array.length = 0 で配列を空にできる

length0 にすると配列を空にすることができるようです!

const array = ['シャミ子', 'もも', 'みかん'];
const refArr = array;

array.length = 0;
console.log(array);
// => []
console.log(refArr);
// => []
// 参照が切れないので参照先も空になる

この方法なら再代入がないので const で元の配列を作成することができます!!
ただ、配列への参照が切れないので、参照している変数があると意図せず内容を変化させてしまう可能性 (副作用) があります。
関数に渡した場合も同様なので注意が必要です。

const arrayEmpty = (array) => {
  array.length = 0;
  return array;
}

const array = ['シャミ子', 'もも', 'みかん'];
const refArr = array;

arrayEmpty(refArr);
console.log(refArr);
// => []
console.log(array);
// => []
// refArr を空にしたつもりが元の配列も空になってしまう

副作用を発生させないためには配列をコピーして使うのが良さそうです。


[参考]

関数型プログラミングの基礎 JavaScriptを使って学ぶ

関数型プログラミングの基礎 JavaScriptを使って学ぶ

👆 この本読んでる。出だしにエニグマ買得のチューリングの話とか出てきて面白い。(超数学的だけど…)

まちカドまぞく (4) (まんがタイムKRコミックス)

まちカドまぞく (4) (まんがタイムKRコミックス)