深拷贝:创建一个新的对象,去拷贝另一个对象的属性和属性值。以此类推,把对象所有深层次的 属性值都拷贝一遍。
浅拷贝:创建一个新的对象,去拷贝另一个对象的属性和属性值,如果属性值是对象类型,只是把对象的地址拿过来用了。只是拷贝的第一层的属性,第二层用的还是原来的。
实现浅拷贝的方法:
方法一:创建对象
let obj1 = {
name: 'zhangsan',
child: {
name:'zhangsanf'
}
};
let obj2 = {}
obj2.name = obj1.name;
obj2.child = obj1.child;
console.log(obj1 === obj2);//false
//对象的地址一样
console.log(obj1.child === obj2.child );//true
方法二:浅拷贝函数
// 遍历一个对象的属性名和属性值 添加到 另一个新对象中
function copy(o){
// 遍历一个o的属性名和属性值 添加到 另一个新对象中
let newObj = {}
for(let key in o){//其作用是将对象 o 中所有的键值对复制到一个新的对象 newObj 中。
let value = o[key];
newObj[key] = value;
}
console.log(newObj);
return newObj;
}
let resObj = copy(obj1);//调用copy()
console.log(resObj);
console.log(resObj.child === obj1.child);//true
方法三:展开运算符
//3.展开运算符实现 浅拷贝
let obj3 = {...obj1};
console.log(obj3);
console.log(obj3.child === obj1.child);//true
方法四:assign方法
//4. Object.assign浅拷贝
let obj4 = {}
Object.assign(obj4, obj1)
console.log(obj4);
console.log(obj4 === obj1);//false
console.log(obj4.child === obj1.child);//true
实现深拷贝的方法:
方法一:递归方法实现
function deepCopy(obj) {
let newObj = {};
//遍历obj的属性名和属性值 都添加到newObj中,如果属性值是一个对象,做判断,再创建给新对象,把属性值对象key和value添加到 新对象中
for (let key in obj) {
let value = obj[key]
if (typeof value === 'object') {
// 如果是 创建要给新的value ,和 value 一样
// 调用自己
let newValue = deepCopy(value)
newObj[key] = newValue;
} else {
// 如果属性不是对象,就直接存入新对象中
newObj[key] = value;
}
}
return newObj;
}
let resObj = deepCopy(obj1)
console.log(resObj === obj1);//false
console.log(resObj.child === obj1.child);//false
//调用自己 继续执行 找孩子
方法二:JSON方法
let str = JSON.stringify(obj1)
console.log(str);
// JSON.parse 内部会创建一个新对象,放字符串里面的属性名和属性值
let obj2 = JSON.parse(str)
console.log(obj1 === obj2);//false
console.log(obj1.child === obj2.child);//false
第三方库实现深拷贝和浅拷贝:
<script src="https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>
let obj1 = {
name: 'zhangsan',
child: {
name:'zhangx'
}
};
// obj1.child.father = obj1;
console.log(obj1);
let obj2 = _.clone(obj1);
console.log(obj2);
console.log(obj2 === obj1);//false
//浅拷贝
console.log(obj2.child === obj1.child);//true
//深拷贝
let obj3 = _.cloneDeep(obj1);
console.log(obj3);
console.log(obj3.child === obj1.child);//false