首先要清楚js的数据类型,和存储方式(栈,堆)。
对象的赋值其实是将对象名存储在栈中,对应存储的值为堆中数据的引用指针。
基本数据类型的存储则是直接存储在栈中。
浅拷贝:如果对象的属性的值为对象,则保存的为对象的指针,修改指针指向对象的值,则两个对象均会发生变化
Object.assign({},obj1,obj2)
obj = {...obj1}
深拷贝:两个对象互相不干扰,修改值不会有影响
1、obj1 = JSON.parse(JSON.stringify(obj2)) 这种方法只能深拷贝对象和数组,不能拷贝函数,循环引用(就是在对象的属性对应的值为对象本身),还不能拷贝(Date,RegExp,Error)
2、for in 循环递归
function deepClone(obj){ if(typeof obj ===‘object‘){ //判断obj类型,这里只考虑对象和数组 //typeof 返回的值有7种,均为字符串类型 number,string,boolean,undefined symbol,function,object const objClone = Array.isArray(obj)?[]:{}; for(let key in obj){ if(obj.hasOwnProperty(key)){ objClone[key] = deepClone(obj[key]) } } return objClone }else{ //如果不是上面两种类型直接返回 return obj } }
先写到这
原文:https://www.cnblogs.com/yangdakuan/p/12262594.html