(1)浅克隆:只克隆数据/对象的第一层级内容开辟新的堆内存,而第二层及以下的内容则直接引用(使用原来第二层级以下层级的堆内容),如果对其克隆后的对象二层级及以下层级进行修改时,原对象也会跟着被修改。
实现浅克隆
for (let key in obj) {
if (!obj.hasOwnProperty(key)) break;
obj1[key] = obj[key]
}
展开运算符
let obj2 = {
...obj1
}
Object.assign()
(2)深克隆:克隆数组或对象的每个层级,不管一个对象或数组有多少层级,那么当我们进行深克隆时每一个层级都会开辟一块新的堆内存地址,克隆后对象/数组的任何层级做任何修改都不会影响到克隆前的对象/数组。
实现深克隆
let obj1 = JSON.parse(JSON.stringify(obj))
注:使用这种方法如果有属性值是正则,函数或者日期格式都会出现问题
正则/Math数学函数会被处理为空对象
具备函数/Symbol/undefined属性值的属性会被直接删除掉
日期对象转换后变为字符串
自己封装一个deepclone
function deepClone(obj) {
// 过滤特殊情况
if (obj === null) return null
if (typeof obj !== 'object') return obj
if (obj instanceof RegExp) {
return new RegExp(obj)
}
if (obj instanceof Date) {
return new Date(obj)
}
// 不直接创建空对象,克隆的结果和之前保持相同的所属类
let newObj = new obj.constructor
for (let key in obj) {
if(obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key])
}
}
return newObj
}