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

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

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

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

Q&A

解決済

1回答

386閲覧

javascriptの返り値について

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2020/07/16 14:14

発生している問題

JavaScriptにて、double関数内で配列の中身を入れ替える処理をしています。
配列の中身を入れ替え後にreturnをしていませんが、
console.log(i)の中は入れ替え後の結果が入ってました。

何故returnしなくとも結果が帰ってくるのでしょうか?
理屈を教えていただけないでしょうか...

該当のソースコード

js

1function double(array) { 2 let tmp = 0; 3 4 tmp = array[1]; 5 array[1] = array[0]; 6 array[0] = tmp; 7 8} 9 10const i = [7,5]; 11double(i); 12console.log(i);

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

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

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

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

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

guest

回答1

0

ベストアンサー

doubleでの処理が、
引数に渡されたオブジェクトの参照を切らさない代入の仕方をしているからです。

引数arrayは、iの値のコピーが入るのではなく、iが保持していた配列オブジェクト値と同じ参照をもっている状態です。

つまり、arrayiで同じオブジェクトを参照しているので、arrayにおいてのプロパティである、配列インデックスの値の変更は、同じオブジェクトを参照しているi側から見たとき、参照元が変化しているため、iも変化したように見えます。
(実際にはiは変化しておらず、ただ単に参照元が変化しただけ)

この関数の引数の参照に関しては、
言語によってだったり、処理のさせ方によって変わってきますが、ひとまず、JavaScriptで今回のケースではこういう仕様ということです。

投稿2020/07/16 14:54

編集2020/07/16 15:08
miyabi_takatsuk

総合スコア9528

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

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

sousuke

2020/07/16 15:09

この手の質問みると「参照渡し」関連で荒れないかちょっとヒヤヒヤしてしまう自分がいるw
miyabi_takatsuk

2020/07/16 15:12 編集

w JSは参照渡しも値渡しもないけど、一見ありそうに見えるから、 しばしば回答揺れだったり、見解の相違とかで荒れやすいですよね。
sousuke

2020/07/16 15:23

「実際どうしているかまで気にする人」「結果だけあっていればいい人」 「javascriptしか触ってない人」「Cとかも触ったことのある人」 スタンスがバラバラですからね…最終的に「この現象」に「名前をつけて認識する」人次第なんで 非常に難しい問題ですよね。指してる現象(結果)はみんな理解しているのに荒れてしまう。
miyabi_takatsuk

2020/07/16 15:34

そうなんですよね。 私は最初のころどちらかというと、結果だけ合ってれば系の人間で、 適当にかじって、参照渡しや!って回答したりして、 かなりご指摘をいただいて、ようやく学んだくちです。 (確かに、現象だけ見れば参照渡しに見えるんですが、難しい・・・) おかげで、JSの参照の仕組みはだいぶ理解が進みましたが、 どうにも参照渡しが明示的に存在する言語にあまり触れたことがなく、 逆に参照渡しの理解があまりありません 汗 PHPくらいですかね、参照渡しが存在する言語の中で、比較的触れてるのは。 (しかもPHP実務で参照渡しほぼ使ったことない・・・)
m.ts10806

2020/07/16 21:44

>ちょっとヒヤヒヤしてしまう 同じく。 意識して使えるようになるのはかなり至難ですよね。私もなんとなくでしかやってないし、想定の動作してくれないときに都度対応策考えて逃がしてます。
miyabi_takatsuk

2020/07/17 00:45

> 想定の動作してくれないときに都度対応策考えて逃がしてます。 ほんとにこれですよね。 例えなんとなくでも、そういったものだと認識してるだけでも、対応策とれるかどうかの分かれ道だと思います。 単純な参照範囲+一歩だけでも先、理解できれば、なんで値変更できないんだ?とか、変更しささるんだ?が減って、細かい実装を迷わずできるようになる、といつも思います。 特にAngularとか、フレームワークは参照の理屈わかってないと細かい実装ほんと無理です 汗
退会済みユーザー

退会済みユーザー

2020/07/17 01:51

ありがとうございます。 今回の場合は配列(ミュータブル)な物でかつ変数の内部の値を変更したので 参照渡しのように見えるという事でいいのでしょうか。
miyabi_takatsuk

2020/07/17 03:05

それであってます。 ちなみにJavaScriptでは、 意図的にプロパティを凍結しない限りは全てミュータブルです。 (constで宣言してもプロパティはミュータブル)
退会済みユーザー

退会済みユーザー

2020/07/18 01:06

ありがとうございます。 JavaScriptが全てミュータブルなのは初めて知りました..
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問