2017-11-29 10 views
0

オブジェクトのリファレンスとjavascriptのオブジェクトに割り当てられたリファレンスを見る方法オブジェクトでlodash _.clone()を使用し、 1としてold.idを更新中JavaScriptのオブジェクトのリファレンスと参照の方法を知る方法

var Obj = {id : 0, box: 0, ei : 0}; 
     var model = {id : 0,ob : [{c: 1, a: 0}],com: _.clone(Obj)}; 
     var old=_.clone(model) 
     old.id=1; 
     console.log(old.id===model.id); //false correct 
     old.com.id=1; 
     console.log(old.com.id===model.com.id);//true 

怒鳴るの例では、モデルIDが更新されていません、しかし、1としてold.com.idを更新しながら、今model.com.idも、なぜ更新しましたか?

+0

*オブジェクト*内の参照は何ですか、オブジェクトは参照を使用して割り当てられます。ですから、 'var a = {}'を実行すると、 '{}'ではなく 'a 'がメモリ位置を保持します。 *オブジェクトに割り当てられた参照を見る方法*私が知る限り、あなたはできません。 * model.com.idも理由を更新しました。なぜなら、_.cloneはディープコピーをしないからです。第1レベルのみコピーする – Rajesh

+0

ディープコピーのオプションについては、これを参照できます。https://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-deep-clone-an-object- in-javascript – Rajesh

答えて

0

_.cloneはシャローコピーを行います。つまり、新しいオブジェクトを作成し、古いオブジェクトのすべての値に対して同じ値を新しいオブジェクトに割り当てます。プリミティブ(ブーリアン、数字、文字列)の場合、これはコピーされたことを意味します。これは必要であり、多くの異なる参照はすべて "1"の値を持つことができますが、そのうちの1つが更新されるとすべてが更新されるわけではありません。参照(Objects and Arrays)の場合、割り当てられた値と元のものは同じものを参照します。これらのルールは、何かを割り当てるときはいつでも真です。例えば

: "メモリ内の同じスポット"

var a = {value:1} 
var b = {value:2} 
a.b = b // this sets the property "b" in a to the reference of the 'b' object. 
// so a.b and b now reference the same object 
// so "a.b.value" is the *same* location in memory as "b.value" 
// so if you update a.b.value or b.value you'll see it change in both references (because they are the same) 

これが鍵です。例を続ける:

var c = _.clone(a) 

// these three lines are equivalent to the line above 
var c = {} 
c.value = a.value 
c.b = a.b 

// "c.b.value" is the "same spot in memory" as "a.b.value" and "b.value" 
// So when you set it to a new value that value will change for all objects 
// but "a.value" was just copied to c when it was created 
// So "c.value" and "a.value" are different spots in memory 
// So changing "c.value" has no effect on "a.value" 

申し訳ありませんコメントを読むには少し難しいですが、私はそれが文章の流れ対時間でそれを1行を見ることができますだと思います。

関連する問題