复制对象或数组的不同方法是什么?
主题
JavaScript
在GitHub上编辑
TL;DR
在 JavaScript 中复制对象或数组,可以使用多种方法。对于浅拷贝,可以使用扩展运算符(...
)或 Object.assign()
。对于深拷贝,可以使用 JSON.parse(JSON.stringify())
或像 Lodash 的 _.cloneDeep()
这样的库。
// Shallow copy of an arrayconst originalArray = [1, 2, 3];const shallowCopyArray = [...originalArray];console.log(shallowCopyArray); // [1, 2, 3]// Shallow copy of an objectconst originalObject = { a: 1, b: 2 };const shallowCopyObject = { ...originalObject };console.log(shallowCopyObject); // { a: 1, b: 2 };// Deep copy using JSON methodsconst deepCopyObject = JSON.parse(JSON.stringify(originalObject));console.log(deepCopyObject); // { a: 1, b: 2 };
复制对象或数组的不同方法
浅拷贝
使用扩展运算符
扩展运算符(...
)是一种创建数组或对象浅拷贝的简洁方法。
// Shallow copy of an arrayconst originalArray = [1, 2, 3];const shallowCopyArray = [...originalArray];console.log(shallowCopyArray); // [1, 2, 3]// Shallow copy of an objectconst originalObject = { a: 1, b: 2 };const shallowCopyObject = { ...originalObject };console.log(shallowCopyObject); // { a: 1, b: 2 };
使用 Object.assign()
Object.assign()
也可以用来创建对象的浅拷贝。
const originalObject = { a: 1, b: 2 };const shallowCopyObject = Object.assign({}, originalObject);console.log(shallowCopyObject); // { a: 1, b: 2 };
深拷贝
使用 JSON.parse(JSON.stringify())
这种方法是一种创建对象或数组深拷贝的简单方法。但是,它也有局限性,例如无法处理函数、undefined
或循环引用。
const originalObject = { a: 1, b: { c: 2 } };const deepCopyObject = JSON.parse(JSON.stringify(originalObject));console.log(deepCopyObject); // { a: 1, b: { c: 2 } }
使用 Lodash 的 _.cloneDeep()
Lodash 是一个流行的实用程序库,它提供了一个 _.cloneDeep()
方法,用于深拷贝对象和数组。
const _ = require('lodash');const originalObject = { a: 1, b: { c: 2 } };const deepCopyObject = _.cloneDeep(originalObject); // { a: 1, b: { c: 2 } }
其他方法
使用递归
对于自定义深拷贝逻辑,您可以实现一个递归函数。
function deepCopy(obj) {if (obj === null || typeof obj !== 'object') {return obj;}if (Array.isArray(obj)) {return obj.map((item) => deepCopy(item));}const copy = {};for (const key in obj) {if (obj.hasOwnProperty(key)) {copy[key] = deepCopy(obj[key]);}}return copy;}const originalObject = { a: 1, b: { c: 2 } };const deepCopyObject = deepCopy(originalObject);console.log(deepCopyObject); // { a: 1, b: { c: 2 } }