JavaScript 对象复制是指创建一个新的对象,并将原对象的所有属性和值复制到新对象中。对象复制在编程中非常重要,因为它允许我们在不影响原始对象的情况下操作新对象。
在 JavaScript 中,对象是通过引用传递的。这意味着如果你直接将一个对象赋值给另一个变量,两个变量实际上会引用同一个对象。为了创建一个完全独立的对象副本,我们需要进行深拷贝或浅拷贝。
let originalObj = { a: 1, b: { c: 2 } };
let shallowCopy = { ...originalObj }; // 使用扩展运算符
// 或者使用 Object.assign()
let shallowCopy2 = Object.assign({}, originalObj);
// 修改浅拷贝中的嵌套对象会影响原对象
shallowCopy.b.c = 3;
console.log(originalObj.b.c); // 输出 3
let originalObj = { a: 1, b: { c: 2 } };
// 使用 JSON 方法进行深拷贝(注意:这种方法有局限性,例如不能复制函数和循环引用)
let deepCopy = JSON.parse(JSON.stringify(originalObj));
// 或者使用递归函数实现深拷贝
function deepClone(obj) {
if (obj === null || typeof obj !== 'object') return obj;
let clone = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key]);
}
}
return clone;
}
let deepCopy2 = deepClone(originalObj);
// 修改深拷贝中的嵌套对象不会影响原对象
deepCopy.b.c = 4;
console.log(originalObj.b.c); // 输出 3
问题:使用 JSON.parse(JSON.stringify(obj))
进行深拷贝时,遇到函数或循环引用会失败。
解决方法:
lodash
的 _.cloneDeep()
方法。const _ = require('lodash');
let originalObjWithFunc = { a: 1, b: { c: 2 }, d: function() { console.log('function'); } };
let deepCopyWithLodash = _.cloneDeep(originalObjWithFunc);
通过以上方法,可以有效地进行 JavaScript 对象的复制,并根据不同的需求选择合适的拷贝方式。
领取专属 10元无门槛券
手把手带您无忧上云