方法一:递归方法
function deepClone(obj){
var copy = obj instanceof Array ? [] : {};
for(var key in obj){
if(obj[key] && typeof obj[key]==="object"){
copy[key] = deepClone(obj[key]);
}else {
copy[key] = obj[key];
}
}
return copy;
}
方法二:利用JSON.parse和JSON.stringfy方法
function deepClone(obj){
return JSON.parse(JSON.stringify(obj));
}
存在的问题:会忽略undefined,Symbol和函数,如:
obj = { a: { b: function(){} }, b: undefined, sym: Symbol("symbol") } ==> 拷贝结果为:{ a: {} }
方法三:利用Object的相关方法
function deepClone(obj){
var copy = Object.getPrototypeOf(obj); // IE9
var keys = Object.getOwnPropertyNames(obj); // IE9
keys.forEach(function(key){
let desc = Object.getOwnPropertyDescriptor(obj, key); // IE9
Object.defineProperty(copy, key, desc);
});
return copy;
}
方法四:在node环境下,可以通过querystring模块实现
var qs = require("query-string");
function deepClone(obj){
return qs.parse(qs.stringOf(obj));
}
存在的问题:会忽略undefined,且存在Symbol值时会报错,对象中的函数拷贝后变成了字符串,且拷贝后的函数不继承自Object,即copy instanceOf Object返回false