1.浅克隆
比如我们定义一个变量,然后我们把它赋值给另外一个变量,另外一个变量只是之前变量的一份拷贝,前后两个变量的存储地址是公用的,对象,数组,函数等这些拷贝的是地址,数字,字符串,布尔值这些拷贝值。
function shallowClone(obj){
if (obj == null) { return null }
let cloneObj = {}
for (let i in obj) {
cloneObj[i] = obj[i]
}
return cloneObj
}
2.深克隆
在堆内存中开辟一块新内存,将原对象中的所有值全部复制过去,与原对象完全脱离
分两组类型:1.基础类型,引用类型
1)递归
function deepClone(obj){
let cloneObj = obj instanceof Array ? [] : {}
if (typeof obj === 'Object') {
for (let i in obj) {
cloneObj[i] = typeof obj[i] === 'object' ? deepClone(obj[i]) : obj[i]
}
} else {
cloneObj = obj
}
return cloneobj
}
2)
JSON.stringify/parse
-- | 和原数据是否指向同一对象 | 第一层数据为基本数据类型 | 原数据包含子对象 |
赋值 | 是 | 改变会使原数据一同改变 | 改变会使原数据一同改变 |
浅拷贝 | 否 | 改变不会使原数据一同改变 | 改变会使原数据一同改变 |
深拷贝 | 否 | 改变不会使原数据一同改变 | 改变不会使原数据一同改变 |