プリミティブ型 (数値、文字列など) は値で渡されます。ただし、オブジェクトは値で渡される場合 (この場合、オブジェクトを保持する変数はオブジェクトへの参照であるとみなされます) と参照で渡される場合 (オブジェクトの変数がオブジェクト自体を保持するとみなされる場合) があるため、不明です。
結局は問題ではありませんが、引数を渡す規則を正しく提示する方法を知りたいです。これに関するセマンティクスがどうあるべきかを定義している 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
。
代わりに、渡されたアイテムは値渡しされるという状況です。しかし、値渡しされるアイテム自体は参照です。技術的には、これはコール・バイ・シェアリング。
実際には、これは、パラメータ自体を変更した場合( および の場合)、パラメータに入力された項目には影響しないことを意味しますnum
。obj2
ただし、パラメータの内部を変更した場合、その変更は上位に伝播します( の場合obj1
)。