質問:
プリミティブ型(Number、Stringなど)は値によって渡されるけど、でもObjectは決まってない、なぜなら値渡し(オブジェクトを保持する変数が実際にはオブジェクトへの参照である場合)にも参照渡し(あるオブジェクトへの変数がそのオブジェクト自体を保持している時)の療法があるから。
あと、あんまり重要じゃないけど、引数を渡す慣習的なやり方の正しい方法ってある?あと、これに関するセマンティクスが何でべきか定義してるようなJavaScriptの仕様を抜粋したものとかって無いかな??
回答1:
これはJavascriptで面白い問題だよね。こんな例を考えてみよう:
|
これは次のような出力をする:
|
もし純粋な値渡しでだった場合、 obj1.item
を変更することは関数の外ではobj1
への影響は全く無い。
もし参照渡しだった場合、話が変わってくる。 num
は100
、 obj2.item
はchanged
になる。
そうじゃなくて、考える状況は渡されたアイテムが値渡しであって、でも値渡しされるアイテムそれ自身は参照になってる状況だ。
技術的には、これはcall-by-sharingって呼ばれてる。
実際には、(num
とobj2
のように)パラメータ自体を変更した場合、それはパラメータに渡されるアイテム自身には影響を与えない。でも、(obj1
のように)パラメータの内部を変更すると、その影響は(obj1
に)伝わっていく。
回答2:
基本常に値渡しだけど、オブジェクトの場合は変数の値は参照になってる。だから、オブジェクトを渡してそのメンバーを変更すると、その変更は関数の外でも引き継がれる。
これは、参照渡しのように見える。でも、実際にオブジェクト変数の値を変更すると変化が引き継がれないことがわかるので、それが本当に値渡しであることの証明になってる。
例:
|
出力:
|
Source: Is JavaScript a pass-by-reference or pass-by-value language?