浅拷贝:将对象中的各个属性依次进行复制,浅拷贝只复制了一层对象的属性。如果对象属性中还有对象,那么赋值的仅仅是地址。还是会相互影响。
深拷贝:将对象中的各个属性一次进行复制,深拷贝会递归赋值所有层对象的属性。如果对象属性中还有对象,会继续拷贝,这样拷贝出来的对象完全独立。
一、浅拷贝
1、封装一个函数, 能够拷贝一个对象 传入一个对象,返回一个新对象
function copy(obj) {
var newObj = {};
for(var k in obj) {
// 不管是简单类型还是值类型, 直接进行了拷贝
// 如果是复杂类型,直接拷贝,拷贝的仅仅是个地址
newObj[k] = obj[k];
}
return newObj;
}
2、创建一个新的对象
var obj = {
name: '张三',
age: 18,
car: {
brand: '奔驰',
price: 100
}
}
3、调用copy函数
var newObj = coby(obj);
//修改newObj中的属性
newObj.name = '李四';
newObj.car.brand = '宝马';// 打印obj中的属性值
console.log(obj.name);// 张三
console.log(obj.car.brand);//宝马
可以看出newObj只复制了obj中第一层属性,当改变newObj中car对象的属性值时obj中的car的属性值也跟着改变了,所以对于里面的car对象只是复制了一个地址,newObj中的car与obj中的car指向同一个car对象
二、深拷贝
function deepCopy(obj) {
var newObj = {};
for(var k in obj) {
// 判断 obj[k] 的类型, 如果是简单类型,直接拷贝 如果是复杂类型,需要继续拷贝
// console.log(obj[k]);
// if (typeof obj[k] === 'object') {
// // 如果obj[k]是复杂类型, 需要拷贝一份这个对象,交给newObj
// newObj[k] = deepCopy(obj[k]);
// } else {
// newObj[k] = obj[k];
// }
newObj[k] = typeof obj[k] === 'object' ? deepCopy(obj[k]) : obj[k];
}
return newObj;
}
调用deepCopy函数
var obj = {
name: '张三',
age: 18,
car: {
brand: '奔驰',
price: 100
}
}var newObj = coby(obj);
//修改newObj中的属性
newObj.name = '李四';
newObj.car.brand = '宝马';// 打印obj中的属性值
console.log(obj.name);// 张三
console.log(obj.car.brand);//奔驰
可以看出newObj不仅拷贝了第第一层属性,car对象也完全拷贝了,当改变newObj中car对象的属性值时obj中的car对象的属性值并没有改变