有人可以解释我这个javascript对象的"复制"行为

Han*_*ans 7 javascript javascript-objects

我有以下代码(我使用的是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);
Run Code Online (Sandbox Code Playgroud)

我的问题:当我做obj.key = jsonobj并且我在新的obj.key中更改值时.为什么jsonobj中的值也会改变?我怎么能避免这种情况?(我想要一个新的jsonobj"副本").

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

Dom*_*nic 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)";
Run Code Online (Sandbox Code Playgroud)

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


Guf*_*ffa 3

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

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

obj.key = $.extend({}, jsonobj);
Run Code Online (Sandbox Code Playgroud)

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

  • 另外值得注意的是,您需要“$.extend(true, {}, jsonobj)”进行深层复制(而不是浅层复制)。 (3认同)