質問: listB[0]) // => true ``` 1つ目の方はlistBに入った配列の箱への参照自体をlistAにコピーしたという認識で合ってますでしょうか? 逆に2つ目の方はlistBに入った配列が持つ各値への参照をlistAにコピーしたという認識でよろしいでしょうか? 非常に基礎的な質問で恐縮ですが、ご回答頂けると助かります。
回答: こんにちは。 一つ目の > > > listA = listB.concat() > > > は、listBの配列+αをlistAに設定しています。 ※提示頂いた例だと、concatの引数に何も渡していないので、listBと全く同じ内容が生成されて、listAに設定されていますね。 たとえば、 > > > listA = listB.concat([4,5,6]); > > > とすると、 listAの中身は1,2,3,4,5,6 で、 listBの中身は1,2,3 になります。 したがって、concatを使うとことで、listAとlistBは参照関係ではなく、 全く別のオブジェクトして定義されていることになりますね。 ※配列内の要素も別オブジェクトです。 そのあと、listB.shift()でlistBの要素[0]を削除していおり、 直後に ===(厳密等価演算子)で判定していますね。 ===(厳密等価演算子)は、オブジェクトの型も考慮して演算してくれます。 listAとlistBの中身はすべて数値型で定義されているようなので、 数字が合っていれば、trueが帰ってきます。 ※==(等価演算子)の場合、 1=="1" でもtureになっちゃいます。 ※これは、暗黙的に "1" == "1" に変換されてしまうためです。 二つ目の例で、 > > > listA = listB; > > > ですが、これはlistAにlistBの参照を渡していることになります。 したがって、listAの実態はlistBのことですので、 密接な関係にあるといえますね。 ※listAまたはlistBの中身を変えると、お互いに影響しあいます。 ■さいごに、、、 > > 1つ目の方はlistBに入った配列の箱への参照自体をlistAにコピーしたという認識で合ってますでしょうか? > > > 答え: いえ、少し違います。concatは新たにオブジェクトを生成して、 その結果をlistAに入れているため、listAとlistBは全く別物です。 中の各要素も、listAとlistBは別ものとして定義されます。 > > > 逆に2つ目の方はlistBに入った配列が持つ各値への参照をlistAにコピーしたという認識でよろしいでしょうか? > > > "各値"というより、"listBオブジェクトへの参照"が、listAに代入されているという意味のほうが正しいです。 コピーという言葉を使うと、少し混乱するかもしれません。 ※listAは、listBへの"ショートカットアイコン"みたいなイメージだと伝わりますかね? ご参考になれば幸いです。