JavaScript は参照渡し言語ですか、それとも値渡し言語ですか? 質問する

JavaScript は参照渡し言語ですか、それとも値渡し言語ですか? 質問する

プリミティブ型 (数値、文字列など) は値で渡されます。ただし、オブジェクトは値で渡される場合 (この場合、オブジェクトを保持する変数はオブジェクトへの参照であるとみなされます) と参照で渡される場合 (オブジェクトの変数がオブジェクト自体を保持するとみなされる場合) があるため、不明です。

結局は問題ではありませんが、引数を渡す規則を正しく提示する方法を知りたいです。これに関するセマンティクスがどうあるべきかを定義している JavaScript 仕様の抜粋はありますか?

ベストアンサー1

JavaScript では興味深いです。次の例を考えてみましょう。

function changeStuff(a, b, c)
{
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);
console.log(obj1.item);
console.log(obj2.item);

出力は次のようになります:

10
changed
unchanged
  • obj1まったく参照でない場合は、変更しても関数の外部obj1.itemには影響しません。obj1
  • 引数が適切な参照であれば、すべてが変わります。numは となり100、 とobj2.item読み取られます"changed"。 代わりに、numはそのまま残り10、 "obj2.itemのままになります"unchanged

代わりに、渡されたアイテムは値渡しされるという状況です。しかし、値渡しされるアイテム自体は参照です。技術的には、これはコール・バイ・シェアリング

実際には、これは、パラメータ自体を変更した場合( および の場合)、パラメータに入力された項目には影響しないことを意味しますnumobj2ただし、パラメータの内部を変更した場合、その変更は上位に伝播します( の場合obj1)。

おすすめ記事