270
141

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

3歳娘「パパ、もう参照渡しの話はやめて?」

Last updated at Posted at 2019-04-20

【JS】いかがでしたか!?値渡しと参照渡しの使い分け!?
↑の続編やで。↑の記事は別に読まんでええけどな!

休日のワイ

ワイ「お、そろそろ15時やから酒でも飲もか・・・」

娘(3歳)「パパー」

ワイ「ん、なんや娘ちゃん?」

娘「このfalseっていうのは何て読むの?」
娘「ファルス?それともフォルス?」

ワイ「なんや、お勉強してんのか?えらいなぁ」
ワイ「そんで何やったっけ?」
ワイ「あー、falseな」
ワイ「これは・・・」

ワイ「バルスや」

娘「そっかー」
娘「バルス!

ワイ「おお、ええ発音や」
ワイ「でもあんまりパパに向かって言わんといてな」

よめ太郎「(誰に向かって言うてもアカンわ)」
よめ太郎「(むちゃくちゃ教えんなや)」
よめ太郎「(お前をバルスすんで)」

ワイ「ちょっとパパは参照渡しの記事を書いたら怖い人達に総叩き・・・いや沢山の有り難いご指摘をされてもうてな」
ワイ「お勉強し直してるところやから」
ワイ「娘ちゃんはアンパンパーソンでも見とき」

娘「うん!」
娘「バルス!

よめ太郎「(バルスを訂正せえや!)」

お勉強再開

ワイ「なるほどな。JSでは結局、変数に保存されるのは参照型の値なんやな」
ワイ「ほな変数から変数にコピーするときも全部参照渡しいうことやな」

娘「パパ、違うよ?

ワイ「ファッ!?

娘「そもそも変数に代入するときは渡しって呼ばないんだよ」

ワイ「おお、せやな(まじか)」

娘「値渡しとか参照渡しっていうのは」
娘「関数に対して引数渡すときの言葉なの」

ワイ「せやな〜(なるほど・・・)」

娘「せやなじゃないの」
娘「そんなんだから叩かれるの

ワイ「ぐぬぬ
ワイ「あんまりエグらんといてや・・・」

娘ちゃんの講習開始

娘「例えばJavaScriptで、配列を作ってaという変数に代入するとするでしょ?」

let a = [1, 2, 3];

ワイ「うんうん」

娘「配列が入ったそのaを、関数f引数として渡すの」
娘「そしてその関数fの中で、引数としてaを受け取って、それを新しい配列で上書きするの」

function f(a) {
  a = ["上書き"];
}

f(a);

ワイ「ほうほう」

娘「関数fを実行したあと、関数の外の**元々の変数a**の中身はどうなってると思う?」

ワイ「それは何も変わらんやろ」
ワイ「元のまま、外のaには[1, 2, 3]が入ったままや」
ワイ「関数の中で配列aに要素を追加
したり、一部を編集したりした場合は外のaにも変更が反映されるけど」
ワイ「丸ごと上書きしてもうた場合は別もんになるから、外のaには影響なしや」

娘「そう」
娘「そして、それは値渡しだからそうなるの」
娘「もし、今回みたいに引数で受け取ったものを関数の中で上書きした場合に」
娘「それでも外側のaが変わるとしたら
娘「それが参照渡しなの」

ワイ「ほおお、なるほどなぁ・・・!」

娘「ちなみにJavaScriptでは参照渡しはできないの」
娘「ぜんぶ値渡しなの」
娘「C#とかだと値渡しと参照渡しを使い分けられるんだけどね」

ワイ「あー、せやから袋叩きに・・・いや有り難いご指摘を沢山いただいたんか〜」

娘「そうなの」

ワイ「(ぐぬぬ)」
ワイ「(っていうか何でそんなに詳しいねん)」
ワイ「(薬で小さくなってしまった天才高校生探偵か)」

値型と参照型

娘「ちなみに、C#とかだと値型参照型って言葉があるんだよ」

ワイ「それはどう違うん?」

娘「例えば、新しいオブジェクトを生成して、変数aに代入したとして」
娘「その変数aを、変数bや変数cにも代入してコピーするの」
娘「そのあとaのhogeプロパティを変更しても、bcのhogeプロパティは変わらない」
娘「値型のオブジェクトの場合はそうなるの」
娘「値がコピーされるからね」

娘「逆に参照型のオブジェクトの場合は」
娘「aのhogeプロパティを変更したらbcのhogeプロパティも変わっちゃうの」
娘「値そのものがコピーされるんじゃなくて、参照先の情報がコピーされるだけだからね」
娘「構造体を使うか、クラスを使うか、とかで使い分けるの」

ワイ「はー、ワイは何も知らんかったんやなー」

娘「そうなの」

ワイ「はぁ・・・・」

娘「でも、JavaScriptのオブジェクトや配列の一部を変えるだけならコピー元の変数にも反映されるってことと」
娘「代入し直しちゃうコピー元の変数とは別物になっちゃうっていう挙動が分かってれば」
娘「とりあえず実務では問題ないんじゃない?」

ワイ「(また実務の話かいな)」
ワイ「(義務教育も始まってへんのに実務を視野に入れなはんなや)」

そんなこんなで晩御飯タイム

ワイ「おお!今日の晩御飯は、よめ太郎特製の担々麺かいな」
ワイ「ワイの好きなやつや〜」
ワイ「あ、ちょっと山椒かけたいから取ってや〜」
ワイ「これが本当の山椒渡し、言うてな〜」

よめ太郎「言うと思ったわ」
よめ太郎「ネットでもリアルでもオヤジギャグばっか言うてんな」

ワイ「せ、せやな・・・」
ワイ「はあ、しょうもない記事かいて恥かいて」
ワイ「明日会社行ったら笑われるんちゃうか」
ワイ「いや、そんな嫌な人はおらんな・・・」
ワイ「いや、でも、もしかしたら一人くらいおるかも・・・」
ワイ「あー、どうなんやろ」
ワイ「心配や・・・心配や・・・」
ワイ「明日どんな感じになるんやろ・・・」

娘(3歳)「パパ」
娘「どんな明日が来るか分からないのは、パパだけじゃないの」
娘「どんな明日が来るか、みんな分からないの」
娘「だから怖くないよ?」
娘「いつだって、パパにできる事をやるだけだよ」

ワイ「(何や、不思議な説得力・・・)」

娘「でも」
娘「あんまり変な記事は書かないでね」
娘「私も恥ずかしいから

ワイ「やっぱり恥ずかしい思てたんかい!

おしまい

さらに続編書いたで

パパ、APIってなあに? 〜3歳娘がインターンに来た話〜

270
141
58

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
270
141

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?