返回

如何用 JavaScript 深度拷贝对象

前端

在 JavaScript 中,对象是引用类型,这意味着当您将一个对象赋值给另一个变量时,实际上是将对该对象的引用赋值给该变量。这意味着对该变量所做的任何更改都将反映在该对象上,反之亦然。

在某些情况下,您可能需要创建对象的副本,以便对该副本进行更改而不会影响原始对象。这就是深度拷贝派上用场的地方。深度拷贝会创建该对象的完全副本,包括所有属性和嵌套对象。这样,您可以对该副本进行更改,而不会影响原始对象。

有多种方法可以对 JavaScript 对象进行深度拷贝。一种方法是使用 JSON.parse() 和 JSON.stringify() 方法。JSON.stringify() 方法将对象转换为 JSON 字符串,而 JSON.parse() 方法将 JSON 字符串转换为对象。这是一种非常简单的方法,但它也有一个缺点,那就是它会将对象中的所有属性都转换为字符串。

另一种方法是使用递归函数来对对象进行深度拷贝。这种方法可以更好地保留对象的属性类型,但它也更复杂。

在本文中,我们将介绍使用 JSON.parse() 和 JSON.stringify() 方法来对 JavaScript 对象进行深度拷贝。

首先,我们需要将对象转换为 JSON 字符串。可以使用 JSON.stringify() 方法来做到这一点。

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

const jsonString = JSON.stringify(originalObject);

接下来,我们需要将 JSON 字符串转换为对象。可以使用 JSON.parse() 方法来做到这一点。

const copiedObject = JSON.parse(jsonString);

现在,我们就可以对 copiedObject 所做的任何更改都不会影响 originalObject。

copiedObject.name = 'Jane Doe';

console.log(originalObject.name); // John Doe
console.log(copiedObject.name); // Jane Doe

深度拷贝在 JavaScript 中非常有用。它可以用于创建对象的副本,以便对该副本进行更改而不会影响原始对象。这在许多情况下都非常有用,例如:

  • 当您想要在不修改原始对象的情况下对对象进行更改时。
  • 当您想要将对象传递给函数并在函数中对其进行更改时。
  • 当您想要将对象存储在数据库或缓存中时。