返回
JS深拷贝与浅拷贝及使用场景
前端
2023-11-09 18:31:50
在JavaScript中,当我们对对象进行赋值时,如果直接使用等号(=)进行赋值,则会产生浅拷贝,即两个变量指向同一个内存地址,对其中一个变量的修改将同时影响另一个变量。而深拷贝则会创建一个新的对象,并把原对象的所有属性值复制到新对象中,两个变量指向不同的内存地址,对其中一个变量的修改不会影响另一个变量。
浅拷贝
浅拷贝只复制对象本身的属性值,不会复制嵌套的对象。因此,如果我们对嵌套对象进行修改,则只会影响浅拷贝的对象,而不会影响原对象。
浅拷贝的实现
可以使用扩展运算符(...)来实现浅拷贝。
const person1 = {
name: 'John',
age: 30,
son: {
name: 'Bob',
age: 10
}
};
const person2 = { ...person1 };
person2.son.name = 'Alice';
console.log(person1); // { name: 'John', age: 30, son: { name: 'Alice', age: 10 } }
console.log(person2); // { name: 'John', age: 30, son: { name: 'Alice', age: 10 } }
浅拷贝的使用场景
浅拷贝通常用于需要快速复制对象的情况,例如在函数参数传递中或在创建一个新对象时。
深拷贝
深拷贝会复制对象本身的属性值以及所有嵌套对象的属性值。因此,如果我们对嵌套对象进行修改,则只会影响深拷贝的对象,而不会影响原对象。
深拷贝的实现
可以使用JSON.parse()和JSON.stringify()来实现深拷贝。
const person1 = {
name: 'John',
age: 30,
son: {
name: 'Bob',
age: 10
}
};
const person2 = JSON.parse(JSON.stringify(person1));
person2.son.name = 'Alice';
console.log(person1); // { name: 'John', age: 30, son: { name: 'Bob', age: 10 } }
console.log(person2); // { name: 'John', age: 30, son: { name: 'Alice', age: 10 } }
深拷贝的使用场景
深拷贝通常用于需要对对象进行完全复制的情况,例如在存储对象数据或在进行数据传输时。
总结
浅拷贝和深拷贝是JavaScript中两种不同的拷贝方式,它们各有自己的使用场景。在进行对象赋值时,需要根据实际情况选择合适的拷贝方式。