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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaScript

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

Q&A

3回答

2624閲覧

シャローコピーについて

fbygqw

総合スコア37

JavaScript

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

1グッド

4クリップ

投稿2017/10/03 14:57

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

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

よろしくお願いします。

退会済みユーザー👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

投稿2017/10/04 03:06

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

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

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

投稿2017/10/04 00:22

編集2017/10/04 00:25
mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

javascriptのコードで書くと、「シャローコピー」とは以下のようなものであると考えています。

javascript

1arrClone = arr.slice();

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

javascript

1arrClone = arr;

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

また、

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

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

投稿2017/10/04 02:12

Lhankor_Mhy

総合スコア35865

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lhankor_Mhy

2017/10/07 06:30

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問