数组和对象的浅克隆和深克隆
(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 }
上一篇:
IDEA上Java项目控制台中文乱码