深度克隆
为什么需要深度克隆?
通常只有引用类型(如object,array)需要克隆,为什么呢?因为JavaScript引用类型直接赋值给一个变量的话,其实都是指向同一个内存地址,访问的是同一个对象,所以我们在改变新赋值的对象时,另一个对象也会被改变,引起一些不必要的麻烦,这是我们就需要克隆一个新的对象出来,就是长得一摸一样的对象,但他们不互相影响,怎样的才能做到呢,一种是采用类的方式,另一种则是递归遍历,接下来我们就开始撸码
/**
* 默认是浅度克隆,就是对象的第一层不相等,将第二个参数设为true即为深度克隆,对象的每一层都不相等
*/
function clone (obj, isDeep = false) {
const isArray = Array.isArray(obj); //判断是不是数组
const isObj = (typeof obj === 'object') && obj !== null; //判断是不是对象
const _obj = isArray ? [] : isObj ? {} : obj; //如果不是数组或对象那就直接赋值
if(isObj){
for(let o in obj){
if(typeof obj[o] === 'object' && isDeep) _obj[o] = clone(obj[o],isDeep); //如果是对象类型并且isDeep为真,就继续递归
else _obj[o] = obj[o]; //否则直接赋值
}
}
return _obj; //返回新对象
}