オブジェクトを代入した参照型変数を別の変数に単純代入した場合もシャローコピーと言うのでしょうか?
結論
オブジェクトを代入した参照型変数を別の変数に代入した場合はシャローコピーではありません。
理由
@mogamoga1337 さんのコメント にある sharrow copy の説明リンク先に
- They are not the same object (
o1 !== o2
).
と書いてあり、単純代入した場合は o1 === o2
であるため、シャローコピーではない。
> let obj1 = { 'name': 'Taro' };
undefined
> let obj2 = obj1; // 単純代入
undefined
> let obj3 = { ...obj1 }; // スプレッド構文
undefined
> obj1 !== obj2 // 単純代入はシャローコピーではない
false
> obj1 !== obj3 // スプレッド構文はシャローコピー
true
意見交換趣旨
参照型変数を別の変数に単純代入することをシャローコピーと書いてあるQiita記事やブログが散見されますが、それが正しいのか間違いのか意見交換したいです。
言語やデータ型によって異なるというコメントをいただきましたので、参照型変数・参照型オブジェクトに限定します。
私は、オブジェクト自体をコピーする(新たなオブジェクトを生成して内容をコピーする)方法としてシャローコピーかディープコピーかという言葉を使うのだと理解していました。
Wikipediaの「Object copying」にも、「In that case a new object B is created(新たなオブジェクトBを生成する)」と書いてあるのですが、Object copying 以外に代入にも使用する言葉なのかはわかりませんでした。
オブジェクトを浅く(1階層だけ)コピーするのがシャローコピーで、単純代入とは影響範囲が異なります。
種類 | 1層目への代入 | 深い層への代入 |
---|---|---|
単純代入(参照のコピー) | 影響する | 影響する |
シャローコピー | 影響しない | 影響する |
ディープコピー | 影響しない | 影響しない |
どなたか「単純代入もシャローコピー」あるいは「単純代入はシャローコピーとは言わない」などと書いてある情報処理の教科書や各種言語の公式ドキュメントをご存じの方はいらっしゃいませんでしょうか?
ちなみに、ChatGPTに聞いてみたのですが「代入はシャローコピーの一種」と返答されました。
参考: https://developer.mozilla.org/ja/docs/Glossary/Shallow_copy
オブジェクトのシャローコピーとは、コピーがコピー元のオブジェクトとプロパティにおいて同じ参照を共有する(同じ基礎値を指す)コピーのことを指します。
シャローコピーの例let ingredients_list = ["noodles", { list: ["eggs", "flour", "water"] }]; let ingredients_list_copy = Array.from(ingredients_list);
シャローコピーの説明ではArray.from
で新たな配列を作って内容をコピーしています。
ですが、以下のように新たなオブジェクトを作らない単純代入したコードをシャローコピーの例として書いてあるQiita記事やブログを見かけます。
let ingredients_list = ["noodles", { list: ["eggs", "flour", "water"] }];
let ingredients_list_copy = ingredients_list;