在JavaScript中,对对象进行拷贝的场景比较常见。但是简单的复制语句只能对对象进行浅拷贝,即复制的是一份引用,而不是它所引用的对象。而更多的时候,我们希望对对象进行深拷贝,避免原始对象被无意修改。
对象的深拷贝与浅拷贝的区别如下:
浅拷贝:仅仅复制对象的引用,而不是对象本身;
深拷贝:把复制的对象所引用的全部对象都复制一遍。
1.深拷贝
function deepCopy(obj) {
var result = Array.isArray(obj) ? [] : {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
if (typeof obj[key] === 'object' && obj[key]!==null) {
result[key] = deepCopy(obj[key]); //递归复制
} else {
result[key] = obj[key];
}
}
}
return result;
}
2.浅拷贝
/**
*@method extend 对象的浅复制
*@param{object} obj 要拷贝的对象
*@return {object} 复制完成的对象
*/
function extend(obj){
var obj2 = {}
for(var key in obj){
obj2[key] = obj[key]
}
return obj2;
}
3.使用es6方法拷贝对象
function clone(obj){
var originObject = Object.getPrototypeOf(obj)
return Object.assign(Object.create(originObject),obj)
}