jQuery 深度克隆不是递归的
jQuery deep clone isn't recursive
我正在使用 js/jQuery 并试图创建一个真正的克隆 - 我目前正在为此使用 jQuery。我希望在多级对象中甚至应该深度克隆子对象,但事实并非如此。下面是我的测试代码和输出,它让我相信 jQuery 的深度克隆实际上并没有克隆所有的子对象。
有没有人写过真正的深度克隆函数,或者有没有办法让 jQuery 的工作按预期进行?
代码:
function deepClone (obj) {
return $.extend(true, {}, obj);
};
var orig = {};
orig.companyData = {};
orig.companyData.TEST= 1;
var deep1 = deepClone(orig);
deep1.companyData.TEST= 0;
var deep2 = deepClone(orig);
console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);
控制台输出:
注意:我期望 1, 0, 1
0
0
0
您必须传递两个要组合的对象
function deepClone (obj1, obj2) {
return $.extend(true, obj1, obj2);
};
var orig = {};
orig.companyData = {};
orig.companyData.TEST = 1;
var deep1 = deepClone(deep1, orig);
deep1.companyData.TEST= 0;
var deep2 = deepClone(deep2, orig);
console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);
jQuery 的扩展功能似乎适用于大多数对象,一些用户建议问题可能与我的 js 对象的创建方式有关 - 我不确定罪魁祸首是什么,但我的解决方案如下:
function deepClone(obj) {
return $.parseJSON(JSON.stringify(obj));
};
我正在使用 js/jQuery 并试图创建一个真正的克隆 - 我目前正在为此使用 jQuery。我希望在多级对象中甚至应该深度克隆子对象,但事实并非如此。下面是我的测试代码和输出,它让我相信 jQuery 的深度克隆实际上并没有克隆所有的子对象。
有没有人写过真正的深度克隆函数,或者有没有办法让 jQuery 的工作按预期进行?
代码:
function deepClone (obj) {
return $.extend(true, {}, obj);
};
var orig = {};
orig.companyData = {};
orig.companyData.TEST= 1;
var deep1 = deepClone(orig);
deep1.companyData.TEST= 0;
var deep2 = deepClone(orig);
console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);
控制台输出:
注意:我期望 1, 0, 1
0
0
0
您必须传递两个要组合的对象
function deepClone (obj1, obj2) {
return $.extend(true, obj1, obj2);
};
var orig = {};
orig.companyData = {};
orig.companyData.TEST = 1;
var deep1 = deepClone(deep1, orig);
deep1.companyData.TEST= 0;
var deep2 = deepClone(deep2, orig);
console.log("orig: " + orig.companyData.TEST);
console.log("deep1: " + deep1.companyData.TEST);
console.log("deep2: " + deep2.companyData.TEST);
jQuery 的扩展功能似乎适用于大多数对象,一些用户建议问题可能与我的 js 对象的创建方式有关 - 我不确定罪魁祸首是什么,但我的解决方案如下:
function deepClone(obj) {
return $.parseJSON(JSON.stringify(obj));
};