7

我有以下代码(我正在使用 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);

我的问题:当我执行 obj.key = jsonobj 并更改新 obj.key 中的值时。为什么 jsonobj 中的值也会发生变化?我将如何避免这种情况?(我想要一个 jsonobj 的新“副本”)。

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

4

5 回答 5

5

我想解决这里发生的一小部分问题,因为其他人已经很好地解决了 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,而是在一段时间后输出。

于 2011-07-06T19:34:02.100 回答
3

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

您可以使用 jQuery 方法扩展来创建副本:

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

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

于 2011-07-06T19:30:43.060 回答
2

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

于 2011-07-06T19:26:22.813 回答
1

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

于 2011-07-06T19:27:12.093 回答
1

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);
于 2011-07-06T19:27:20.427 回答