谁能解释一下这个javascript对象"copy"的行为

Can someone explain me this javascript object "copy" behavior

本文关键字:quot 对象 copy javascript 能解释 一下      更新时间:2023-09-26

我有以下代码(我使用jQquery库):

var obj = {};
var objstring = '{"one":"one","two":"two","three":"three"}'
// first console output
console.log(objstring);
var jsonobj = $.parseJSON(objstring);
// second console output
console.log(jsonobj);
obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";
// third console output
console.log(jsonobj);

我的问题:当我反对的时候。key = jsonobj,并在新的obj.key中更改值。为什么值在jsonobj然后也改变?我该如何避免呢?(我想要一个新的jsonobj的"副本")。

我做了这个测试用例:http://jsfiddle.net/WSgVz/

我想解决这里发生的一小部分,因为其他人已经很好地解决了JavaScript对象引用的更大问题:

// second console output
console.log(jsonobj);
obj.key = jsonobj;
obj.key.test = "why does this affect jsonobj? (even in the second console output)";

这是WebKit文档错误的结果,即console.log语句在调用console.log时不输出对象,而是在一段时间后输出。

这是因为对象没有被复制。obj.key属性将只包含对对象的引用,因此当您将某些内容分配给obj.key.test时,效果与将其分配给jsonobj.test相同。

你可以使用jQuery方法extend来创建一个副本:

obj.key = $.extend({}, jsonobj);

这将复制值到新创建的对象({})。

因为当你执行obj.key = jsonobj时,obj.key中没有一些新的复制对象;它只是对已经存在的jsonobj的引用。所以对obj.key的更改也会改变jsonobj,因为它们实际上是一样的

这是因为没有复制——只有一个对象,它是由各种变量和属性引用的。当您执行obj.key = jsonobj时,您只是将引用复制到同一个对象。

JavaScript中的所有对象都是通过引用复制的,这意味着:

var x = {};
var y = x;
x.foo = 22; // y.foo also = 22 since y and x are the same object

如果需要obj.key != jsonobj,则需要克隆对象。通过创建一个新对象:

obj.key = $.parseJSON(objstring);

或使用jQuery克隆现有的:

obj.key = $.extend({}, jsonobj);