深拷贝和浅拷贝的区别?
一个是地址引用,一个是新开辟一块内存,深拷贝的对象和原对象是两个独立的内容,互不干扰。
思路:前面的类型过滤不说了,主要先判断是数组还是对象,从而创建 不同的中间容器(newObj),那么这里假设传入的是一个对象,传入到deepCopy时,
就会遍历传入对象的内容(item),如果是简单类型,就直接赋值给newObj,
如果item 是个对象,为了获取到item 里的属性,就需要继续调用自己(deepCopy)把对象传入,这样循环地获取对象里的内容,然后返回到newObj上,最后返回newObj,就实现了深拷贝
// 递归调用
const deepCopy = (obj) => {
// 判断传入的值是否为一个对象
if (obj === null && typeof obj !== "object") {
console.log('不是一个对象')
return obj;
}
// 判断对象的类型 注意这里不考虑包装类对象
if (Object.prototype.toString.call(obj) === "[object Date]") {
return new Date(obj);
}
if (Object.prototype.toString.call(obj) === "[object RegExp]") {
return new RegExp(obj);
}
if (Object.prototype.toString.call(obj) === "[object Undefined]") {
return new Error(obj);
}
// 判断对象是类
let newObj = Array.isArray(obj) ? [] : {}
for(let item in obj){
if(typeof obj[item] === 'object') { //如果item是一个对象,就继续引用自己去遍历此对象里的属性,如果此对象里还有对象,就会继续循环获取直至没有对象
console.log('是object')
newObj[item] = deepCopy(obj[item])
}else { // 如果此item 不是一个对象,就直接赋值给newObj
console.log('不是object')
newObj[item] = obj[item]
}
}
return newObj
};
const foo = {
name: '渣渣辉',
info: {
age: 24
},
fn:()=>{
console.log('123')
},
test : 10086
}
const newFoo = deepCopy(foo)
foo.info.age = 25
console.log(foo === newFoo) // false ,地址不一样证明实现深拷贝