首先,克隆只针对对象、数组、函数等复杂数据。
浅克隆就是将栈内存中的引用复制一份,赋给一个新的变量,本质上两个指向堆内存中的同一地址,内容也相同,其中一个变化另一个内容也会变化(根本上改变的是同一个对象)。

深克隆就是创建一个新的空对象,开辟一块内存,然后将原对象中的数据全部复制过去,完全切断两个对象间的联系。

深克隆

基于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都没有改变

Q.E.D.


学而不厌 不耻下问