配列はオブジェクト
JavaScriptの配列はオブジェクトです。そのため、比較やコピーの際の挙動に注意が必要です。
配列同士の比較
配列の中身が同じでも、オブジェクトのインスタンスが異なると==
では期待する比較ができないので注意が必要です。
ts
constlist1 = [1, 2, 3];constlist2 = [1, 2, 3];console .log (list1 ==list2 );
ts
constlist1 = [1, 2, 3];constlist2 = [1, 2, 3];console .log (list1 ==list2 );
PHPでは配列(インデックス配列)は要素の内容で等価比較できますが、JavaScriptでは同じようにはできないので注意しましょう。
php
<?php$list1 = [1, 2, 3];$list2 = [1, 2, 3];var_dump($list1 === $list2); //=> bool(true)
php
<?php$list1 = [1, 2, 3];$list2 = [1, 2, 3];var_dump($list1 === $list2); //=> bool(true)
このような配列の中身を比べるための演算子やメソッドはJavaScriptにはないため、中身を比較したいときにはlodashのisEqualなどのパッケージを使うのがお勧めです。
配列のコピー
配列も他のオブジェクトと同様に、代入を用いても値のコピーにはなりません。代入元の変数と代入先の変数は同じ値を指します。そして、一方の変数だけを変更したつもりでも、他方にも変更が反映されます。
ts
constarr = [1, 2, 3];constbackup =arr ;arr .push (4); // 変更console .log (arr );console .log (backup ); // こちらにも影響
ts
constarr = [1, 2, 3];constbackup =arr ;arr .push (4); // 変更console .log (arr );console .log (backup ); // こちらにも影響
上のような単純な配列のコピーには、スプレッド構文を使ってください。
ts
constarr = [1, 2, 3];constbackup = [...arr ]; // スプレッド構文arr .push (4); // 変更console .log (backup ); // 影響なし
ts
constarr = [1, 2, 3];constbackup = [...arr ]; // スプレッド構文arr .push (4); // 変更console .log (backup ); // 影響なし
📄️ 配列のスプレッド構文「...」
JavaScript の配列ではスプレッド構文「...」を使うことで、要素を展開することができます。