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。 事实证明, 如果对象是自定义对象 (即$.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)
还是数组。 否则它只执行参考副本。
这是我尝试了很多方法之后做到的:
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/
链接地址: http://www.djcxy.com/p/80917.html