本質問は、JavaScriptにおける、値の扱いの仕様、
値の参照の置き換えが関係していきます。
非公式でないので、正確性に欠ける可能性がありますが、
読んでいる限りは、合っていると思ったので、
参考記事を記載します。
JavaScriptに参照渡し/値渡しなど存在しない - Qiita
まず、プリミティブな値(数値や文字列など)が基本とすると理解できる、かと思いますので、その解説から。
javascript
1let a = 10; // 値10が生成され、aは、10という値への参照となる。
2console.log(a) // 10
基本、変数は、メモリに格納された値の参照であり、変数自体には値が入っていないということです。
では、変数に変数を代入した時はどうなるかというと、
javascript
1let a = 10;
2let b = a; // 変数bは、値10への参照になる。aもbも10という値を"参照"している状態
3console.log(a) // 10
4console.log(b) // 10
となります。
ですが、プリミティブな値の場合、bを変更しても、a自体はなんら変化がありません。
それはなぜかというと、
javascript
1let a = 10;
2let b = a; // 変数bは、値10への参照になる。aもbも10という値を参照している状態
3b = 100; // 値100が新たに生成され、bはその値への参照となる。aとは独立している(aは値10への参照を失わない)
4console.log(a); // 10
5console.log(b); // 100
となり、ようは、参照の置き換えが発生します。
では、本質問のようなことがなぜ起こるのか。
配列やオブジェクトではそもそも参照している段階が違うと言いますか、
プリミティブなものとは、参照している値が違うからです。
※今回の質問は配列ですが、オブジェクトの方が説明がしやすいので、オブジェクトで解説していきます。
javascript
1const a = {key: 0, value: 15}; // aは{}の参照となる。そして、各プロパティは、各値の参照となる
という状態になり、a自体は、{}というオブジェクト自体の参照となります。
そして、各プロパティは、各値の参照となります。
よって、このオブジェクト参照の変数を、他の変数に代入するとどうなるか。
javascript
1const a = {key: 0, value: 15}; // aは{}の参照となる。そして、各プロパティは、各値の参照となる
2const b = a; // bは{key,value}というオブジェクト自体の参照となる
3b.value = 35; // {key,value}というオブジェクトの、valueの値の参照が置き換わる。そのため、a、b自体の参照は置き換わらない
4// よって、下記のような結果となる
5console.log(a.value); // 35
6console.log(b.value); // 35
つまり、変数に、オブジェクト変数を代入すると、
その代入先は、代入元のオブジェクト自体の参照となります。
そして、そのオブジェクトのプロパティに値を代入し直すと、
そのプロパティ自体の値の参照が置き換わるが、
オブジェクト自体への参照が置き換わるわけではないため、
a、b自体はなんら変わるわけではないわけです。
a、bは同じオブジェクトを参照しているため、bの方でプロパティの値参照を変えようと、aの方で変えようと、
同じオブジェクトを参照しているため、プロパティは共通の値となるのです。
例えば、一つのコップをAさんBさんが同時に手にもっているとします。
コップには水が入っています。
Bさんが、コップの水を捨て、お茶に置き換えれば、コップの中身は変わっても
コップ自体は変わらないのと同じです。
(二人の人間が手に持ちながら、中身を入れ直す絵面は、想像すると微妙ですが)
これは、配列においても同じことがいえます。
(というかJavaScriptにおいては配列もオブジェクト)
javascript
1const a = ['まさひこ', 'たかひこ']; // aは[0, 1]の参照となる。そして、要素(インデックス)は、各値の参照となる
2const b = a; // bは[0, 1]という配列自体の参照となる
3b[0] = 'ひこざぶろう'; // [0, 1]という配列の、0インデックスの値の参照が置き換わる。そのため、a、b自体の参照は置き換わらない
4// よって、下記のような結果となる
5console.log(a[0]); // ひこざぶろう
6console.log(b[0]); // ひこざぶろう
よって、今回の配列のような参照元の配列の値の参照が置き換わるので、今回の質問のような結果となります。
前回答状態では、誤解と、間違った回答となっていたため、
大変に失礼しました。
また、間違っている部分があれば、ご指摘いただければ幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。