浅拷贝
浅拷贝只复制某个对象的引用,而不复制对象本身,新旧对象还是共享同一块内存
实现
1.直接赋值
基本数据类型赋值过程都是浅拷贝的过程
2.Object.assign()
let a={};
let b={c:{d:1}};
Object.assign(a,b);
console.log(a); //{c:{d:1}}
//Object 注意事项
//1.它不会拷贝对象的继承属性
//2.它不会拷贝对象的不可枚举属性
//3.可以拷贝Symbol类型的属性
3.Array.prototype.concat()
4.Array.prototype.slice()
5.手动实现
function shallowCopy(object) {
// 只拷贝对象
if (!object || typeof object !== "object") return;
// 根据 object 的类型判断是新建一个数组还是对象
let newObject = Array.isArray(object) ? [] : {};
// 遍历 object,并且判断是 object 的属性才拷贝
for (let key in object) {
if (object.hasOwnProperty(key)) {
newObject[key] = object[key];
}
}
return newObject;
}
深拷贝
深拷贝会创造一个一摸一样的对象,新对象和原对象不共享内存,修改新对象不会改变原对对象
实现
1.JSON.parse(JSON.stringify())
2.手动实现
function deepCopy(object) {
if (!object || typeof object !== "object") return object;
let newObject = Array.isArray(object) ? [] : {};
for (let key in object) {
if (object.hasOwnProperty(key)) {
newObject[key] = deepCopy(object[key]);
}
}
return newObject;
}
浅拷贝与深拷贝的区别
总结:区别在于浅拷贝无论新旧数组哪个发生了变化,两者都会发生变化,因为两者都引用的同一个地址,也是在同一个地址上进行操作的;深拷贝正好与之相反