JavaScript对象克隆

时间:2013-01-19 18:51:52

标签: javascript object cloning

在这种情况下,有人可以解释为什么obj会返回{a:2}而不是{a:1}吗?

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

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

3 个答案:

答案 0 :(得分:3)

javascript中的对象是引用的,因此当您更改一个引用时,您更改了它们。这意味着你刚刚创建了一个浅层副本,你需要做一个深度克隆。

可以使用jQuery以这种方式进行深层复制:

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

阅读这个我使用jQuery的原因: What is the most efficient way to deep clone an object in JavaScript?
<子> (这是关于Stackoverflow的John Resig ......)

答案 1 :(得分:0)

在这种情况下,您不是克隆对象,而是设置对同一变量的其他引用。 data.obj.a和obj.a指向完全相同的内存位置。第3行将此内存值设置为2。

要进行深度克隆,请尝试以下方法:

var data = JSON.parse(JSON.stringify(obj));

答案 2 :(得分:0)

如果使用NS派生的浏览器,如FF:

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以及 The structured clone algorithm - Web developer guide | MDN

提示:皇帝没有衣服