2

この場合の代わりになぜobj返品するのか誰かが説明できますか?{a:2}{a:1}

var obj = {a:1};
var data = {b:obj};
data.b.a = 2;

console.log(obj); // {a:2}
4

3 に答える 3

3

JavaScript のオブジェクトは参照によるものなので、1 つの参照を変更すると、それらも変更されます。これは、浅いコピーを作成したばかりで、深いクローンを作成する必要があることを意味します。

ディープ コピーは、次の方法で jQuery を使用して作成できます。

// Deep copy
var newObject = jQuery.extend(true, {}, obj);

私がjQuery を使用した理由を読んでください: JavaScript でオブジェクトをディープ クローンする最も効率的な方法は何ですか?
(Stackoverflow の John Resig です...)

于 2013-01-19T18:54:46.070 に答える
0

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

ヒント:皇帝は服を着ていない

于 2014-03-20T16:32:11.263 に答える
0

この場合、オブジェクトを複製するのではなく、同じ変数への追加の参照を設定します。data.obj.a と obj.a はまったく同じメモリ位置を指しています。行 3 は、このメモリ値を 2 に設定します。

ディープ クローンを作成するには、次の手順を試してください。

var data = JSON.parse(JSON.stringify(obj));
于 2013-01-19T18:56:24.247 に答える