【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プロパティを変更しても、b
やc
のhogeプロパティは変わらない」
娘「値型のオブジェクトの場合はそうなるの」
娘「値がコピーされるからね」
娘「逆に参照型のオブジェクトの場合は」
娘「a
のhogeプロパティを変更したらb
やc
のhogeプロパティも変わっちゃうの」
娘「値そのものがコピーされるんじゃなくて、参照先の情報がコピーされるだけだからね」
娘「構造体を使うか、クラスを使うか、とかで使い分けるの」
ワイ「はー、ワイは何も知らんかったんやなー」
娘「そうなの」
ワイ「はぁ・・・・」
娘「でも、JavaScriptのオブジェクトや配列の一部を変えるだけならコピー元の変数にも反映されるってことと」
娘「代入し直しちゃうとコピー元の変数とは別物になっちゃうっていう挙動が分かってれば」
娘「とりあえず実務では問題ないんじゃない?」
ワイ「(また実務の話かいな)」
ワイ「(義務教育も始まってへんのに実務を視野に入れなはんなや)」
そんなこんなで晩御飯タイム
ワイ「おお!今日の晩御飯は、よめ太郎特製の担々麺かいな」
ワイ「ワイの好きなやつや〜」
ワイ「あ、ちょっと山椒かけたいから取ってや〜」
ワイ「これが本当の山椒渡し、言うてな〜」
よめ太郎「言うと思ったわ」
よめ太郎「ネットでもリアルでもオヤジギャグばっか言うてんな」
ワイ「せ、せやな・・・」
ワイ「はあ、しょうもない記事かいて恥かいて」
ワイ「明日会社行ったら笑われるんちゃうか」
ワイ「いや、そんな嫌な人はおらんな・・・」
ワイ「いや、でも、もしかしたら一人くらいおるかも・・・」
ワイ「あー、どうなんやろ」
ワイ「心配や・・・心配や・・・」
ワイ「明日どんな感じになるんやろ・・・」
娘(3歳)「パパ」
娘「どんな明日が来るか分からないのは、パパだけじゃないの」
娘「どんな明日が来るか、みんな分からないの」
娘「だから怖くないよ?」
娘「いつだって、パパにできる事をやるだけだよ」
ワイ「(何や、不思議な説得力・・・)」
娘「でも」
娘「あんまり変な記事は書かないでね」
娘「私も恥ずかしいから」
ワイ「やっぱり恥ずかしい思てたんかい!」
〜おしまい〜