概念
首先,我们需要简单了解什么是深拷贝,什么是浅拷贝。
深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;
浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;
1.通过JSON对象
这个方法可以简单粗暴的实现深拷贝,但是还存在问题,拷贝的对象中如果有函数,undefined,symbol,当使用过JSON.stringify()进行处理之后,都会消失。
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
let objClone = JSON.parse(JSON.stringify(obj));
return objClone;
}
2、递归实现
这个方法其实也是有缺陷的,没法拷贝一些特殊对象(如 new Map() )
function deepClone(obj) {
// 数据类型为引用数据类型
if (typeof obj === 'object') {
// 初始化返回结果
let result = Array.isArray(obj)? []: {};
for (let key in obj) {
// 避免相互引用出现死循环导致爆栈
if (obj === obj[key]) {
continue
}
if (obj.hasOwnProperty(key)) {
// 递归调用
result[key] = deepClone(obj[key])
}
}
return result;
} else {
// 基本数据类型,直接返回
return obj
}
}
3.jQuery的extend方法实现深拷贝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝
4.函数库lodash的_.cloneDeep方法
var _ = require('lodash')
var obj = {
a: {
c: 2,
d: [9, 8, 7]
},
b: 4
}
var obj1 = _.cloneDeep(obj)
console.log(obj === obj1);//false
5.其他
- Object.assign(obj1, obj2)
- 扩展运算符...
-
concat、slice
注意:只有一级属性为深拷贝,二级属性后就是浅拷贝