返回

js数组对象深拷贝,有了它,你可以轻松玩转引用传递!

前端

js数组对象深拷贝的必要性

在JavaScript中,数组和对象都是引用类型,这意味着当您将它们赋值给另一个变量时,实际上只是将对它们的引用赋值给了该变量。因此,对该变量所做的任何更改都会反映在原始数组或对象上。

这在某些情况下是理想的,例如当您希望在多个组件之间共享数据时。但是,在其他情况下,您可能希望创建一个数组或对象的副本,以便您可以对其进行更改,而不会影响原始数据。

例如,如果您有一个包含用户数据的数组,并且您想对该数组进行排序或过滤,那么您可能希望先创建一个该数组的副本,以便您可以对副本进行更改,而不会影响原始数据。

js数组对象深拷贝的方法

有很多方法可以创建js数组对象深拷贝,其中最常见的方法包括:

  • 使用JSON.parse(JSON.stringify())方法
const originalArray = [{name: "John", age: 30}, {name: "Jane", age: 25}];

const deepCopy = JSON.parse(JSON.stringify(originalArray));

deepCopy[0].name = "Mary";

console.log(originalArray); // [{name: "John", age: 30}, {name: "Jane", age: 25}]
console.log(deepCopy); // [{name: "Mary", age: 30}, {name: "Jane", age: 25}]
  • 使用Array.prototype.slice()方法
const originalArray = [{name: "John", age: 30}, {name: "Jane", age: 25}];

const deepCopy = originalArray.slice();

deepCopy[0].name = "Mary";

console.log(originalArray); // [{name: "John", age: 30}, {name: "Jane", age: 25}]
console.log(deepCopy); // [{name: "Mary", age: 30}, {name: "Jane", age: 25}]
  • 使用Array.prototype.map()方法
const originalArray = [{name: "John", age: 30}, {name: "Jane", age: 25}];

const deepCopy = originalArray.map(item => ({...item}));

deepCopy[0].name = "Mary";

console.log(originalArray); // [{name: "John", age: 30}, {name: "Jane", age: 25}]
console.log(deepCopy); // [{name: "Mary", age: 30}, {name: "Jane", age: 25}]
  • 使用lodash的cloneDeep()方法
const originalArray = [{name: "John", age: 30}, {name: "Jane", age: 25}];

const deepCopy = _.cloneDeep(originalArray);

deepCopy[0].name = "Mary";

console.log(originalArray); // [{name: "John", age: 30}, {name: "Jane", age: 25}]
console.log(deepCopy); // [{name: "Mary", age: 30}, {name: "Jane", age: 25}]

结语

js数组对象深拷贝是一个非常有用的技巧,可以帮助您轻松应对引用传递的难题,避免因浅拷贝导致的数据变化而影响原数据。希望本文对您有所帮助,如果您有任何疑问,请随时留言。

最后,祝您学习愉快!