JS数组的深拷贝
思路1 : 通过重复的浅拷贝,实现深拷贝
思路2 : 通过slice和concat方法
var a = [1,"a",3];
var b = a.slice(0);
var b = a.concat([]);
JS对象的深拷贝
方法一:使用 JSON.parse() 方法
function deepClone(initalObj) {
var obj = {};
try {
obj = JSON.parse(JSON.stringify(initalObj));
}
return obj;
}
弊端: 会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。RegExp对象是无法通过这种方式深拷贝。
方法二:递归拷贝
function deepClone(initalObj,finalObj) {
var obj = finalObj || {};
for (var i in initalObj) {
var prop = initalObj[i];
// 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
if(prop === obj) {
continue;
}
if (typeof prop === 'object') {
obj[i] = (prop.constructor === Array) ? [] : {};
arguments.callee(prop,obj[i]);
} else {
obj[i] = prop;
}
}
return obj;
}
方法三:使用Object.create()方法
直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。