返回

JavaScript 对象深拷贝:全面解析常用方法

前端

  1. JSON.parse(JSON.stringify()) 方法

JSON.parse(JSON.stringify()) 方法是 JavaScript 中最常用的对象深拷贝方法之一。它通过将对象转换为 JSON 字符串,然后再将 JSON 字符串解析为对象的方式来实现深拷贝。

const obj1 = {
  name: 'John',
  age: 30,
  address: {
    city: 'New York',
    state: 'NY'
  }
};

const obj2 = JSON.parse(JSON.stringify(obj1));

console.log(obj1 === obj2); // false
console.log(obj1.address === obj2.address); // false

上面的代码中,obj1 和 obj2 是两个不同的对象,它们各自拥有自己的内存地址。通过 JSON.parse(JSON.stringify()) 方法,我们创建了 obj1 的一个深拷贝 obj2。此时,obj1 和 obj2 是两个完全独立的对象,它们不会相互影响。

2. Object.assign() 方法

Object.assign() 方法是另一个常用的对象深拷贝方法。它可以通过将一个或多个源对象复制到目标对象的方式来实现深拷贝。

const obj1 = {
  name: 'John',
  age: 30,
  address: {
    city: 'New York',
    state: 'NY'
  }
};

const obj2 = Object.assign({}, obj1);

console.log(obj1 === obj2); // false
console.log(obj1.address === obj2.address); // false

上面的代码中,obj1 和 obj2 是两个不同的对象,它们各自拥有自己的内存地址。通过 Object.assign() 方法,我们将 obj1 的所有属性和方法复制到 obj2 中。此时,obj1 和 obj2 是两个完全独立的对象,它们不会相互影响。

3. 扩展运算符(...)

扩展运算符(...)是 ES6 中引入的新语法,它可以将一个数组或对象展开为另一个数组或对象。我们可以利用扩展运算符来实现对象深拷贝。

const obj1 = {
  name: 'John',
  age: 30,
  address: {
    city: 'New York',
    state: 'NY'
  }
};

const obj2 = {...obj1};

console.log(obj1 === obj2); // false
console.log(obj1.address === obj2.address); // false

上面的代码中,obj1 和 obj2 是两个不同的对象,它们各自拥有自己的内存地址。通过扩展运算符,我们将 obj1 的所有属性和方法展开到 obj2 中。此时,obj1 和 obj2 是两个完全独立的对象,它们不会相互影响。

4. Lodash 函数库

Lodash 是一个 JavaScript 函数库,它提供了许多实用的函数,其中包括对象深拷贝函数。我们可以使用 Lodash 函数库来实现对象深拷贝。

const obj1 = {
  name: 'John',
  age: 30,
  address: {
    city: 'New York',
    state: 'NY'
  }
};

const obj2 = _.cloneDeep(obj1);

console.log(obj1 === obj2); // false
console.log(obj1.address === obj2.address); // false

上面的代码中,obj1 和 obj2 是两个不同的对象,它们各自拥有自己的内存地址。通过 Lodash 函数库中的 _.cloneDeep() 函数,我们将 obj1 的所有属性和方法复制到 obj2 中。此时,obj1 和 obj2 是两个完全独立的对象,它们不会相互影响。

总结

在 JavaScript 中,我们可以通过多种方法实现对象深拷贝。JSON.parse(JSON.stringify()) 方法、Object.assign() 方法、扩展运算符(...)和 Lodash 函数库都是常用的对象深拷贝方法。这些方法各有优缺点,我们可以根据自己的需求选择合适的方法来实现对象深拷贝。

我希望这篇文章对您有所帮助。如果您有任何问题,请随时留言。