質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.02%

  • JavaScript

    13817questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

シャローコピーについて

受付中

回答 3

投稿

  • 評価
  • クリップ 4
  • VIEW 287

fbygqw

score 27

以前シャローコピー、ディープコピーとはという質問をしたのですが、「値渡し」や「参照渡し」という用語は引数で渡すときしか使わないというコメントと、代入でもその用語を使うというコメントをいただいたのですが、どちらがより正しいのでしょうか?

また、シャローコピーは、1段だけコピーすることという回答に対して1段だけコピーすること=シャローコピーではないという回答をいただきましたが、どちらが正しいのでしょうか?

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+5

このあたり、言葉だけじゃなくて、箱と矢印を使った絵が、入門書にはきっと載っていると思いますので、書籍を参照されるのも良いかと思います。

まず、「値渡し」「参照渡し」ですが、言葉をどう使うのかは人の自由ですが、本来的な意味では引数でだけ使います。代入も、引数受け渡しと概念が似ているので、転用する人もいるのでしょう。
英語だと、「call by value」「call by reference」と、「call」が入りますので、代入では使えません。

「1段だけコピーすること=シャローコピーではない」については言葉の意味としてはその通りで、三段階に参照で繋がったオブジェクトの場合、1段だけコピーも、2段だけコピーもシャローコピーです。三段全部コピーして初めてディープコピーです。参照の矢印で繋がった先端まで全部コピーしない限りはオブジェクトの共有が起こります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

以前の質問のベストアンサーに一票ですが、当事者じゃ無い人の意見が求められてるのかなと思い、回答してみます。

前提として、用語の意味は常に文脈に依存して変わりますので、何が一般的で何が特殊かという風にとらえたほうが良いと思います。

「値渡し」や「参照渡し」という用語は引数で渡すときしか使わない

一般論として正しいと思います。
ただし、質問者さんが注目すべきは言葉を「使う」、「使わない」よりも、 「値渡し」や「参照渡し」というのは、仮引数を変数として参照した場合にどう解釈されるかの話であるのに対して、シャローコピー、ディープコピーはメモリ上の配列や構造体などのコピーという処理を行う際にどのような動作になるかという処理内容の話です。
微妙なのは C言語の構造体代入のように、代入と言っておきながらコピーしたりするものがあるので若干混乱しますが、そんな特殊な場合を除くと、明示的にコピーしろと言わない限り、変数の代入や引数渡しで配列や構造体のコピーが行われることはありません。

また、シャローコピーは、1段だけコピーすることという回答に対して1段だけコピーすること=シャローコピーではないという回答をいただきましたが、どちらが正しいのでしょうか?

何か言葉の遊びのようで、なんとも言えませんが、シャローコピーとディープコピーを比較する文脈では「1段だけコピーすること」と言って差し支えないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

「シャローコピー」という言葉に明確な定義があるわけでもないのだろうと思いますが、deigoさんの『シャローコピーは参照の参照渡し』という説明には強い違和感を覚えました。
 
javascriptのコードで書くと、「シャローコピー」とは以下のようなものであると考えています。

arrClone = arr.slice();


一方、『参照の参照渡し』とは、javascriptで書くとこうだと思います。

arrClone = arr;


わざわざ「シャローコピー」という言葉を使う必要があるかな、と思いました。
 
また、

「値渡し」や「参照渡し」という用語は引数で渡すときしか使わない

これについてはそのとおりではあるんですが、「ディープコピー」を関数なしで処理するのは難しいので(スプレッド演算子による値展開もSymbol.iterator()を介してますので)、まあそんな固いことを言わなくても、と思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/07 15:30

    マイナス評価をした方、理由を教えていただけますと幸いです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    13817questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。