返回
浅尝浅拷贝,深探深拷贝
前端
2023-11-04 07:05:40
理解浅拷贝和深拷贝
浅拷贝和深拷贝都是为了复制一个对象而创建的。浅拷贝只复制对象的引用(内存地址),而深拷贝则复制对象的全部内容,包括属性和引用类型属性的值。
浅拷贝
浅拷贝只复制对象本身的属性值,但不复制其引用的对象。这意味着浅拷贝的对象与原对象共享相同的引用对象。当修改浅拷贝的对象时,也会修改原对象。
深拷贝
深拷贝复制对象本身的属性值和其引用的对象。这意味着深拷贝的对象与原对象完全独立,修改深拷贝的对象不会影响原对象。
浅拷贝和深拷贝的实现
在 JavaScript 中,浅拷贝可以通过 Object.assign() 方法实现。深拷贝可以通过 JSON.stringify() 和 JSON.parse() 方法实现,也可以通过递归函数实现。
浅拷贝
const obj1 = {
name: 'John Doe',
age: 30,
address: {
street: '123 Main Street',
city: 'Anytown',
state: 'CA',
},
};
const obj2 = Object.assign({}, obj1);
console.log(obj2.name); // 'John Doe'
console.log(obj2.age); // 30
console.log(obj2.address); // { street: '123 Main Street', city: 'Anytown', state: 'CA' }
深拷贝
const obj1 = {
name: 'John Doe',
age: 30,
address: {
street: '123 Main Street',
city: 'Anytown',
state: 'CA',
},
};
const obj2 = JSON.parse(JSON.stringify(obj1));
console.log(obj2.name); // 'John Doe'
console.log(obj2.age); // 30
console.log(obj2.address); // { street: '123 Main Street', city: 'Anytown', state: 'CA' }
浅拷贝和深拷贝的优缺点
浅拷贝和深拷贝各有其优缺点,在不同的场景下适用不同的情况。
浅拷贝的优点
- 速度快,效率高
- 实现简单,容易理解
- 不会创建新的对象,节省内存
浅拷贝的缺点
- 修改浅拷贝的对象会影响原对象
- 无法复制引用类型属性的值
- 不适合复制复杂的对象
深拷贝的优点
- 可以完全复制对象,包括引用类型属性的值
- 修改深拷贝的对象不会影响原对象
- 适合复制复杂的对象
深拷贝的缺点
- 速度慢,效率低
- 实现复杂,理解困难
- 会创建新的对象,占用更多内存
浅拷贝和深拷贝的应用场景
浅拷贝和深拷贝在不同的场景下都有其适用之处。
浅拷贝的适用场景
- 复制简单对象,如字符串、数字、布尔值等
- 复制引用类型属性指向的原始值,如字符串、数字、布尔值等
- 复制引用类型属性指向的不可变对象,如 Date 对象、String 对象、Number 对象等
深拷贝的适用场景
- 复制复杂对象,如数组、对象、函数等
- 复制引用类型属性指向的可变对象,如数组、对象、函数等
- 复制引用类型属性指向的对象包含循环引用