返回

让程序动若脱兔的秘籍:JS深拷贝与浅拷贝揭秘

前端

进入正题,我们先从浅拷贝开始。浅拷贝只复制对象的第一层,而不会递归复制对象中嵌套的对象。这就好比复印机只复印纸张正面,而不复印背面一样。

const obj = {
  name: 'John Doe',
  address: {
    street: '123 Main Street',
    city: 'Anytown',
    state: 'CA',
    zip: '12345',
  },
};

const b = Object.assign({}, obj);

console.log(b);

执行这段代码后,b 将指向一个新对象,该对象包含 obj 对象第一层的副本。这意味着 b.name 将等于 "John Doe",但 b.address 将指向同一个对象。

如果我们修改 b.address.street 的值,我们也会修改 obj.address.street 的值,因为它们都指向同一个对象。

b.address.street = '456 Elm Street';

console.log(obj.address.street); // 456 Elm Street

现在我们来看深拷贝。深拷贝会递归复制对象中的所有属性,包括嵌套的对象。这就好比复印机不仅复印纸张正面,还会复印背面一样。

const obj = {
  name: 'John Doe',
  address: {
    street: '123 Main Street',
    city: 'Anytown',
    state: 'CA',
    zip: '12345',
  },
};

const b = JSON.parse(JSON.stringify(obj));

console.log(b);

执行这段代码后,b 将指向一个新对象,该对象包含 obj 对象的深拷贝。这意味着 b.name 将等于 "John Doe",并且 b.address 将指向一个新对象,该对象包含 obj.address 的副本。

如果我们修改 b.address.street 的值,我们不会修改 obj.address.street 的值,因为它们指向不同的对象。

b.address.street = '456 Elm Street';

console.log(obj.address.street); // 123 Main Street

现在您已经了解了浅拷贝和深拷贝之间的区别。浅拷贝只复制对象的第一层,而深拷贝会递归复制对象中的所有属性。

浅拷贝通常用于需要快速复制对象的情况,而深拷贝通常用于需要创建对象副本的情况。例如,如果您需要创建一个对象副本,以便您可以对副本进行修改,而不影响原始对象,那么您应该使用深拷贝。