这篇简短的文章介绍了一种可用于创建javascript对象的“深拷贝”的方法。 您可能会问:“我们为什么需要这个?” ...答案:“仅基本数据类型的变量值是字符串,int,float,boolean,并且为了使混淆更加完美:)也起作用! 按值传递,所有其他按引用传递。” 这意味着,当您创建对象a时(如下面的代码所示),并将对象a分配给变量b时,您将通过引用传递对象a。 结果是,当您为b.foobar分配新值时,a.foobar将会相应地更改。 要按值传递值,可以想像为对象a的(深层)副本,我们必须使用一个函数,将对象a内任何数据结构的值递归复制到对象b。
// example object that might be cloned
var a = {
foo : { test: 1, test1: 2 },
bar : function(a) { alert(a) },
foobar: 'foobar1',
arr : [1, [8, 9], {1: 1, 2: 2}, 4]
};
/**
* function clone_obj deep-clones an js-object
*
* @param obj javascript-object
* @return c cloned javascript-object
*/
function clone_obj(obj) {
if (typeof obj !== 'object' || obj == null) {
return obj;
}
var c = obj instanceof Array ? [] : {};
for (var i in obj) {
var prop = obj[i];
if (typeof prop == 'object') {
if (prop instanceof Array) {
c[i] = [];
for (var j = 0; j < prop.length; j++) {
if (typeof prop[j] != 'object') {
c[i].push(prop[j]);
} else {
c[i].push(clone_obj(prop[j]));
}
}
} else {
c[i] = clone_obj(prop);
}
} else {
c[i] = prop;
}
}
return c;
}
// usage: we clone object a to object b
var b = clone_obj(a);
注意:为什么我们不能使用该功能复制dom节点?
答:dom-nodes包含对其父对象和子对象等的引用。使用上述方法复制该对象时,我们会得到一个错误:“太多的递归” ...因为复制父对象时,我们来到了一个子对象然后从那里到它的父节点,等等...为了克隆dom节点,我们可以简单地使用cloneNode()dom方法。
测试人员需要;)...我认为它的工作方式应该...但我可能忽略了某些东西吗?
testing-help:在firebug控制台中进行测试时,测试场景例如可以是:
var a = {
foo : { test: 1, test1: 2 },
bar : function(a) { alert(a) },
foobar: 'foobar1',
arr : [1, [8, 9], {1: 1, 2: 2}, 4]
};
var c = a;
c.foobar = 'new test';
function clone_obj(obj) {
if (typeof obj !== 'object' || obj == null) {
return obj;
}
var c = obj instanceof Array ? [] : {};
for (var i in obj) {
var prop = obj[i];
if (typeof prop == 'object') {
if (prop instanceof Array) {
c[i] = [];
for (var j = 0; j < prop.length; j++) {
if (typeof prop[j] != 'object') {
c[i].push(prop[j]);
} else {
c[i].push(clone_obj(prop[j]));
}
}
} else {
c[i] = clone_obj(prop);
}
} else {
c[i] = prop;
}
}
return c;
}
var b = clone_obj(a);
b.foobar = 'test';
b.bar = function(a) { alert(a + a) };
console.info(a.toSource());
console.info(b.toSource());
From: https://bytes.com/topic/javascript/insights/718427-deep-cloning-js-objects