首先,克隆只针对对象、数组、函数等复杂数据。
浅克隆就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容也相同,其中一个变化另一个内容也会变化(根本上改变的是同一个对象)。
深克隆就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。
深克隆
基于JSON的方法实现深克隆,存在的问题(因为JSON.stringfy变为字符串,很多类型)是不支持的): ++
- 正则/Math对象会被处理为 空对象
- 具备函数/Symbol/undefined属性值得属性值会被干掉
- BigInt处理不了,而且还会报错。。。。
- 日期对象最后还是字符串
let obj = JSON.parse(JSON.stringify(obj1))
===================
function fun(obj){ // 利用递归来遍历整个对象确保是最后一层
let item = {}
if(typeof obj !=="object")return obj
for(let i in obj){
item[i] =fun(obj[i])
}
}
====================
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4],
b=deepClone(a);
a[0]=2;
console.log(a,b);
浅克隆
let obj = {
name:"小明",
age:18
}
let obj1 = {
...obj // ES6展开运算符
}
============
let obj2 = obj.slice()
============
// 把obj2合并到obj1,让obj2内容替换Obj1内容,最后返回来的是Obj1
Object.assign(obj1,obj2)
Object.assign({},obj1,obj2) // 这样处理返回的是一个新对象,obj1/obj2都没有改变
评论区