jquery.extend(true,,obj)没有创建深层副本

jsFiddle在这里 。

如果深度复制工作,输出将是“好奇的乔治”而不是“安德的游戏”。 我该如何制作深层照片? 这个问题的答案表明$.extend(true, [], obj)创建了一个深层副本。 然而我的例子表明它没有。

 function Person(){} Person.prototype.favorite_books = []; var george = new Person(); george.favorite_books = ["Curious George"]; var kate = new Person(); kate.favorite_books = ["The Da Vinci Code", "Harry Potter"]; var people = [kate, george]; var people_copy = $.extend(true, [], people); people_copy[0].favorite_books[0] = "Ender's Game"; $('#text').text(people[0].favorite_books[0]); 

我更新了jsFiddle。 事实certificate, 如果对象是自定义对象 (即$.isPlainObject返回false),我需要单独深度复制数组中的每个对象。

现在这里是真正的答案:

目前,jQuery只能克隆纯JavaScript对象,而您正在使用自定义JavaScript对象。 这很明显,因为jQuery无法知道如何实例化一个新的自定义对象。 所以这按预期工作:

 var george = {}; george.favorite_books = ["Curious George"]; var kate = {}; kate.favorite_books = ["The Da Vinci Code", "Harry Potter"]; var people = [kate, george]; var people_copy = $.extend(true, [], people); console.log(people_copy[0].favorite_books == people[0].favorite_books); 

参考jQuery代码: https : //github.com/jquery/jquery/blob/master/src/core.js#L305

看它检查它是否是jQuery.isPlainObject(copy)或它是一个数组。 否则它只执行参考副本。

这是我在尝试了许多方法后的方法:

 var newArray = JSON.parse(JSON.stringify(orgArray)); 

这将创建一个新的深拷贝,而不是浅拷贝。

此外,这显然不会克隆事件和函数,但好的是你可以在一行中完成它,它可以用于任何对象之王(数组,字符串,数字,对象等)。

有趣……它看起来不像是深拷贝数组。

您必须单独深度复制每个对象。

 var people_copy = []; $.each(people,function(i,obj) { people_copy.push($.extend(true,{},obj)); }); 

编辑:当然,看看这个OP的小提琴:

http://jsfiddle.net/s2bLv/4/