javascript - jquery.extend(true, [], obj) 不创建深拷贝

标签 javascript jquery

jsFiddle here .

如果深度复制有效,输出将是“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/

相关文章:

asp.net - 使用 asp.net 验证器验证 2 个字段中的 1 个

javascript - 部署服务器时可以让某些代码不运行吗

jQuery UI 可拖动集合 : dragging elements simultaneously

jquery - 使用 Data Uri 作为 a 标签的 href

javascript - ASP.NET MVC 从代码块内访问 JavaScript 变量

javascript - 有没有办法知道Servlet中的JS在浏览器上是否启用?

javascript - 如何使用 PHP 或 Jquery For Stored Time 创建倒计时器

javascript - 事后值(value)变动

jquery - 如何根据alt属性判断图片是否存在?

javascript - 启用询问使用 javascript/jquery 保存下载文件