如果深度复制有效,输出将是“Curious George”而不是“Ender's Game”。我怎样才能做一个深拷贝? 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)。
最佳答案
现在这是真正的答案:
目前 jQuery 只能克隆纯 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)
还是一个数组。否则它只执行引用副本。
关于javascript - jquery.extend(true, [], obj) 不创建深拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512773/