在这种情况下,有人可以解释为什么obj
会返回{a:2}
而不是{a:1}
吗?
var obj = {a:1};
var data = {b:obj};
data.b.a = 2;
console.log(obj); // {a:2}
答案 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
提示:皇帝没有衣服