【JS】いかがでしたか！？値渡しと参照渡しの使い分け！？

## はじめに、の前に陳謝
要は、**オブジェクトや配列の一部を変更するだけなら変数と紐づくものは変わらない**し、**再代入すると変わっちゃう**ってだけで、JSに参照渡しは**ない**みたいです。**数値でも文字列でもオブジェクトでも配列でも！**

ネタ記事としてお楽しみくださいませ。

っていうか、↓**この記事を読んだ方がええわ！！！**
[**JavaScriptに参照渡し/値渡しなど存在しない**](https://qiita.com/yuta0801/items/f8690a6e129c594de5fb)

↓あとワイ自身も**訂正記事を書いたから**よろしくやで！
[**3歳娘「パパ、もう参照渡しの話はやめて？」**](https://qiita.com/Yametaro/items/45dbfd7f544a69ea7b36)

## はじめに

**値渡し**と**参照渡し**。

この2つの言葉、プログラミングを勉強したことがある方なら聴いた事があるんじゃないでしょうか？

今回は**JavaScript**における値渡しと参照渡しの**使い分け方**を調査してみました！

そのほかにも、JavaScriptの**年収**や**新恋人**についての情報も！？

## 記法について

文字アレルギーの方でも読みやすいように、今回は**2ちゃんねる風**の**ワイ記法**を用いて解説していこうと思います！

## ぶいはち君とワイ

ワイ「ぶいはち君、**a**っていう変数を作ってくれや。**a**の中身は**`10`**や」

ぶいはち君「`a = 10`やな。覚えとくで」

ワイ「次は**b**を作ってくれや。中身は**aと同じ**や」

ぶいはち君「**aと同じ**ってことは、**`10`**やな」
ぶいはち君「つまり`b = 10`、覚えておくで」

ワイ「すまん、**事情が変わった**から、**a**の値は**`500`**に変えてくれや」

ぶいはち君「**`a = 500`**やな。分かったで」

ワイ「ちなみに**b**の値は何やったっけ？」

ぶいはち君「**b**？」
ぶいはち君「**b**は**`10`**やで」

## 値渡しについて

JavaScriptでは、数値や文字列は**値渡し**されます。
値渡しの場合は「aの値を`500`に変えてしまっても、bの値は**元のまま**。**`10`のまま**」という挙動になります。

「**b**の値は**a**と同じやで」と言われても「うんうん、**aと同じ**やな」と記憶する**のではなく**「`b = 10`やな」と置き換えて考えてくれるのです。
ちゃんと値自体をコピーしてくれる、ということですね。

## 逆に、参照渡しは
「参照渡し」の場合は「bは、**aと同じものを指すんやな！**」と記憶するイメージです。
「bの値を聞かれたら、**aと同じもんを参照して**答えればええわ！」って感じです。

## 再び、ぶいはち君とワイ

ワイ「ぶいはち君、**a**っちゅう配列を作ってくれや」
ワイ「中身は`1, 2, 3, 4`や」

ぶいはち君「あいよ、覚えとくで」

ワイ「**b**っていう配列も作ってくれや」
ワイ「中身は**a**と同じや」

ぶいはち君「**配列b**は、**配列aと同じ**」
ぶいはち君「覚えたで」

ワイ「事情が変わったわ」
ワイ「配列aの**0番目の値**を**`4`**に変えてくれ」

ぶいはち君「あいよ、ほな配列aの中身は`4, 2, 3, 4`やな」

ワイ「ところで、**配列b**の**0番目の値**は何やったっけ」

ぶいはち君「**配列b？**」
ぶいはち君「ああ、**配列aと同じやつ**やな」
ぶいはち君「ほな、**配列aを見て答えればええ**な」
ぶいはち君「ええと、**配列b**の**0番目**の値は**`4`**や！」

## 参照渡しについて
JavaScriptでは、配列とオブジェクトは**参照渡し**[^1]されます。

「**配列b**の値を聞かれたら、**配列aと同じもんを参照**や！」みたいな**イメージ**です。

なので、配列aの中身をいじった後で配列bの内容を確認すると「**bの内容も変わっとるやんけ！**」となります。

厳密には参照先のメモリアドレスを記憶するらしいので、以下のようにイメージすると良いかもしれません。

## みたび、ぶいはち君とワイ

ワイ「**b**という配列を作ってくれや。中身は**a**と同じや」

ぶいはち君「あいよ」

ぶいはち君「**a**という配列はどこにしまったっけな」
ぶいはち君「メモによると、**3番目の引き出し**やな」

ぶいはち君「**b**いう配列も**aと同じ**やって言うてたな」
ぶいはち君「メモっとかんとな」

ぶいはち君「**b**って言われたら**3番目の引き出しを参照**、と」

## 値渡しと参照渡しの使い分け方は！？

JavaScriptでは自動的に「数値や文字列は**値渡し**」「配列やオブジェクトは**参照渡し**（っぽい値渡し）」となるので、**使い分けはできない**ということが分かりました！

「この変数の中身を変えると、他の変数の中身も変わってまうんか？」
ということだけ意識しておけば良いと思います！

ちなみに

```javascript
const array = [1, 2, 3, 4];
const arrayCopy = [].concat(array);
```
↑こんな感じで**concatメソッド**等を使用することで、配列を値渡しっぽく**丸ごとコピー**できたりしますが、
シャローコピー（1段階の深さのコピー）にしかならないので、多重配列の場合は一部が参照渡しとなってしまい、正しくコピーされません。

↓こんな風に、一回JSON文字列に変換して、再パースすればええやん！などという強者もいるようです（いない）。

```javascript
const json = JSON.stringify(deepNestedObject);
const objectCopy = JSON.parse(json);
```

「コピーガードされとるDVDでも、**再生しながらビデオカメラで録画**すれば複製できるで！」
みたいな感じで**つよい**ですね！（つよい）


## JavaScriptの年収は！？
JavaScriptは各種Webブラウザ上で動作するプログラミング言語ですが、なんと**無料**で使用することができます。
つまり、JavaScriptの年収は**0円**だと分かりました！

JavaScriptプログラマーの年収という意味で言うと、概ね**50万円〜5,000兆円**の間に収まると考えられます。

## JavaScriptの新恋人は！？
JavaScriptはプログラミング言語なので、**恋愛はしないと考えられます**。

強いて言えば、JavaScriptの恋人は**JavaScriptプログラマーある皆さん**であると言えるのではないでしょうか！？


## おわりに

**いかがでしたか？**

残念ながら今回、値渡しと参照渡しの使い分け方は**見つけられませんでした**！
しかし、**JavaScriptの恋人は皆さんだ**ということが分かりました！

それでは、素晴らしい**Javaライフ**を！


**〜Fin〜**


### ここから追記：

コメント欄でご指摘いただいた内容について書くで！

ワイ「**b**という配列を作ってくれや。中身は**a**と同じや」

ぶいはち君「あいよ」
ぶいはち君「**b**て言われたら**aを参照**やな」
ぶいはち君「**完全に理解した**で」

ワイ「やっぱり、**a**の中身は配列やなくて」
ワイ「ただの`3`という数値をぶち込んどいてくれや！」

ぶいはち君「あいよ」

ワイ「ちなみに**b**の中身はなんやったっけ？」

ぶいはち君「さっき**a**の中身は変わったけど・・・」
ぶいはち君「**b**は**配列のままや！**（キリッ」

ワイ「あれ？」
ワイ「**b**の値を答えるときは**aと同じもんを参照**するんやなかったっけ・・・」

#### 実際は「参照値」という「値」を「値渡し」していた

配列やオブジェクトの**一部を変更**した場合には、**a**にも**b**にも**その変更が反映**されますが、
値を再代入すると「**その変数がどの値を参照しているか**」ということ自体が上書きされてしまうため、**aとbは連動しなくなってしまう**のです！

**いかがでしたか！？**

[^1]: 実際にはC++等の参照渡しとは違い「**参照値**」という「**値**」を「**値渡し**」しているので「**参照渡しっぽい値渡し**」のようです。