深拷贝,创建一个新的数组或对象,它的各级键值从原对象(数组)复制了一 份(就是引用地址复制了一份,值也复制了,这两个栈内存中的地址指向各自的堆内存中的值)
浅拷贝,就是把原对象(数组)的引用地址赋给了新对象,新对象和原对象的地址指向的是同一个堆存储地址
深拷贝分两种:
1. 只对第一层级拷贝 (第一层级的元素值都是基本数据类型的)
方法:
a. 遍历赋值(对象/数组)
b. 针对数组 newArr=oldArr.slice() 当slice不带任何参数时,默认返回一个和原数组完全相同的新数组
newArr=oldArr.concat() 相当于合并原数组和一个空数组并返回
c.针对对象 用ES6的Object.assign,对象的合并: newObj=Object.assign({ }, oldObj)
将源对象(第二个起的参数oldObj)的所有可枚举属性复制到目标对象(第一个参数{}),并返回合并后的目标对象(newObj)
d. ES6的扩展运算符(...) newObj={ ...oldObj } newArr={ ...oldArr }
2. 拷贝所有层级(多层嵌套对象或数组)
a. newObj = JSON.parse(JSON.stringify(oldObj) )
newArr = JSON.parse(JSON.stringify(oldArr) )
b. 手动写递归
function deepClone(oldObj){
var newObj = oldObj.constructor===Array? [] :{}
if( typeof oldObj !=='object') return
for (var key in oldObj ){
newObj[key] = typeof oldObj[key] ==='object' ? deepClone(oldObj[key]) : oldObj[key]
}
return newObj
}
c. 用juqery中的extend方法 $.extend([deep], target, oldObj1[,oldObjN])
deep表示是否深拷贝,true(深拷贝)/false(浅拷贝)
target 目标对象 ,其他对象的成员属性将被附加到该对象上
oldObj1 oldObjN第一个及第N个被合并的对象
newObj = $.extend( true, {}, oldObj)