この場合の代わりになぜobj
返品するのか誰かが説明できますか?{a:2}
{a:1}
var obj = {a:1};
var data = {b:obj};
data.b.a = 2;
console.log(obj); // {a:2}
この場合の代わりになぜobj
返品するのか誰かが説明できますか?{a:2}
{a:1}
var obj = {a:1};
var data = {b:obj};
data.b.a = 2;
console.log(obj); // {a:2}
JavaScript のオブジェクトは参照によるものなので、1 つの参照を変更すると、それらも変更されます。これは、浅いコピーを作成したばかりで、深いクローンを作成する必要があることを意味します。
ディープ コピーは、次の方法で jQuery を使用して作成できます。
// Deep copy
var newObject = jQuery.extend(true, {}, obj);
私がjQuery を使用した理由を読んでください:
JavaScript でオブジェクトをディープ クローンする最も効率的な方法は何ですか?
(Stackoverflow の John Resig です...)
FF などの NS 派生ブラウザを使用している場合:
var data = { b: eval ( obj . toSource ( ) ) } ;
また
var data = { b: eval ( uneval ( obj ) ) } ;
そうでない場合:
Object . function . deepClone = function(){
/*
highly non-trivial to accommodate objects like:
animal=123; animal.beastly=432; ie. object "overloading"
monster = new ( function ( ) { this . this = this } ) ( ) ie. self-referential / recursive
Note: JSON cannot do these but toSource () can handle recursive structures
alert ( new ( function ( ) { this . this = this } ) ( ) . toSource ( ) );
ie. #1={this:#1#}
alert ( new ( function ( ) { this [ this ] = this } ) ( ) . toSource ( ) );
ie. #1={'[object Object]':#1#}
alert ( new ( function ( ) { this [ this . toSource ( ) ] = this } ) ( ) . toSource ( ) );
ie. #1={'({})':#1#}
alert ( ( #1 = { '({})' : #1# } ) . toSource ( ) );
ie. #1={'({})':#1#}
*/
}
var data = { b: obj . deepClone ( ) } ;
SO には、構造化されたクローン アルゴリズムと同様に、deepClone を実行する多くの試みが投稿されてい
ます - Web 開発者ガイド | MDN
ヒント:皇帝は服を着ていない
この場合、オブジェクトを複製するのではなく、同じ変数への追加の参照を設定します。data.obj.a と obj.a はまったく同じメモリ位置を指しています。行 3 は、このメモリ値を 2 に設定します。
ディープ クローンを作成するには、次の手順を試してください。
var data = JSON.parse(JSON.stringify(obj));