2017-02-20 5 views
1

JavaScriptで私に見せた複雑さを理解しようとしています。次の簡単な関数を考えてみましょう:JS関数への参照渡しとプロパティのオーバーライドはできますが、オブジェクト全体を上書きすることはできませんか?

function myFunction(p) { 
    p.property = 1; 
} 

var obj = {property: 0}; 
console.log(obj); // {property: 0} 
myFuncton(obj); 
console.log(obj); // {property: 1} 

のは、これを繰り返してみましょうが、その代わりに、オブジェクトの一部を上書きする、のは、オブジェクト全体を上書きしてみましょう:予想通り

function myFunction(p) { 
    p = {property: 1}; 
} 

var obj = {property: 0}; 
console.log(obj); // {property: 0} 
myFuncton(obj); 
console.log(obj); // {property: 0} 

はなぜOBJは、ここでは置き換えられませんか?

+0

JavaScriptは参照渡しを使用していません。 Javaの人たちは、それが価値あるものだとは言いますが、それは本当に参考になります。あまり面倒ではないものがあることを望みます。 "値渡し"は間違った印象を与え、 "オブジェクトによる呼び出し"や "共有による呼び出し"もあいまいです。 – user2357112

答えて

2

ここで、objが期待どおりに置き換えられないのはなぜですか?

あなたはあなたの関数を呼び出すときにオブジェクトobjを参照のコピーを渡しているので。つまり、を変更/変更してに渡すオブジェクトのプロパティを変更することはできますが、実際の参照は変更できません。

コードの面では

// creates an object and a reference to this object is assigned to the obj 
var obj = {property: 0}; 

function myFunction(p) { 
    p = {property: 1}; 
} 

// Here you pass a copy of the reference. 
myFunction(obj); 

は今、何でもやっていることはobjいるので、それはpropertyと呼ばれるプロパティが実際のオブジェクトに反映されています修正するように、このコピーであり、それのコピーが、あなたはポイントを渡す参照です同じオブジェクトに。これが最初のケースで起こっていることです。後者の場合は、渡した参照のコピーに新しい値を代入しようとします。元の参照には何も起こりません。

+0

ありがとう - コード例は、私が理解するのを助けました。 JavaScriptを使うと、頭が痛いことがあります。 –

+0

あなたは非常に歓迎です:)私は助けてうれしいです。 – Christos

1

関数内のローカル変数に新しい値を割り当てるためです。

最初のスニペットは、参照を持つオブジェクトを変更するために機能します。 2番目の方法は、あなたが離れている参照を投げているので、変数に別のオブジェクトを代入しているので機能しません。

関連する問題