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

时间:2013-05-12 22:41:14

标签: javascript jquery

jsFiddle here

如果深度复制有效,输出将是“好奇的乔治”,而不是“安德的游戏”。我怎样才能制作深层照片?对this question的回答表明$.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。事实证明,我需要单独深度复制数组中的每个对象如果对象是自定义对象(即$.isPlainObject返回false)。

3 个答案:

答案 0 :(得分:18)

现在这里是真正的答案:

目前,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)还是数组。否则它只执行参考副本。

答案 1 :(得分:7)

这是我在尝试多种方法后完成它的方式:

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

这将创建一个新的深层副本,而不是浅层副本。

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

答案 2 :(得分:3)

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

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

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

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

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