gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 01:57:55 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com