深拷贝:拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;
浅拷贝:拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;
1、通过JSON对象,简单粗暴
//通过js的内置对象JSON来进行数组对象的深拷贝
function deepClone(obj) {
let objClone = JSON.parse(JSON.stringify(obj));
return objClone;
}
2、通过递归实现
function deepClone(obj) {
// 定义一个变量 并判断是数组还是对象
var objClone = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object' && obj != null) {
// 判断obj存在并且是对象类型的时候 因为null也是object类型,所以要单独做判断
for (var key in obj) {
// 循环对象类型的obj
if (obj.hasOwnProperty(key)) {
// 判断obj中是否存在key属性
if (obj[key] && typeof obj[key] === 'object') {
// 判断如果obj[key]存在并且obj[key]是对象类型的时候应该深拷贝,即在堆内存中开辟新的内存
objClone[key] = deepClone(obj[key])
} else {
// 否则就是浅复制
objClone[key] = obj[key]
}
}
}
}
return objClone
}
3、jQuery的extend方法实现深拷贝
var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝