質問: {"name":"piyo"} arr.push(piyo); }; ``` ### 試したこと 上記のテストコード ### 補足情報(言語/FW/ツール等のバージョンなど) JavaScript
回答: JavaScriptでオブジェクト型を渡す場合について、**C++(仮引数に&つける)、C#(仮引数と実引数の両方にrefつける)、PHP(仮引数に&つける)での「参照渡し」(PHPマニュアルではリファレンス渡しとも)**と同じ動作/仕組みだという意味で「参照渡し」と言っているのであれば、**それは間違いです。**JavaScriptのオブジェクト型の評価戦略は、Javaの参照型、C#の参照型、PythonやRubyのオブジェクト等と同じ方法であり、値渡しの一種※です。 ※ それを何と呼ぶのか一番良いのかを質問しているんですけど、なかなか回答が集まらず、ここでは呼び方は保留します。なお、C++、C#、PHPの参照渡しとは異なる意味で、この渡し方を「参照渡し」と呼ぶ人達は少なからずいます。 この渡し方では、仮引数そのもへの代入によって、呼び出し元の実引数が変わることは**ありません**。なぜなら、一種の値渡しであるため、代入によって、仮引数の値が変わるだけであり、実引数の値は変わらないからです。 Objectを渡して、Objectそのものを変更したければ、 ``` function updateObj(obj){ let piyo = {"name":"piyo"} Object.assign(obj, piyo); }; ``` と、`Object.assign()`でマージしたり、 ``` function updateObj(obj){ obj.name = "piyo"; }; ``` と、`obj`のプロパティへの代入(これは`obj`であるところオブジェクト自体を書き換えているということです)する必要があります。Array側がうまくいくのは`arr.push(piyo)`が`arr`であるところの配列自体を書き換えているからです。 なお、上のコードの場合、undefinedを渡すとエラーになります。このままでは`arr[1]`は最初の段階でundefinedになっていますので、`let arr = [{"id":"123"}, {name: hoge}];`などとして、エラーにならないようにしてください。