在JavaScript中,对象的复制有两种方式:深拷贝和浅拷贝。
浅拷贝
浅拷贝是指创建一个新对象,这个新对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
常用的浅拷贝方法有:Object.assign() 和展开运算符(...)。
// Object.assign() 示例
const obj = { a: 1, b: 2 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1, b: 2 }
// 展开运算符示例
const obj = { a: 1, b: { c: 2 }};
const copy = { ...obj };
console.log(copy); // { a: 1, b: { c: 2 }}
深拷贝
深拷贝是指完全克隆一个对象,即使对象的属性值是引用类型,也会被彻底拷贝,两个对象互不影响。
常用的深拷贝方法有:JSON.parse(JSON.stringify())、Lodash库的_.cloneDeep()方法等。
// JSON.parse(JSON.stringify()) 示例
const obj = { a: 1, b: { c: 2 }};
const copy = JSON.parse(JSON.stringify(obj));
console.log(copy); // { a: 1, b: { c: 2 }}
// Lodash库的_.cloneDeep() 示例
const obj = { a: 1, b: { c: 2 }};
const copy = _.cloneDeep(obj);
console.log(copy); // { a: 1, b: { c: 2 }}
需要注意的是,使用JSON.parse(JSON.stringify())进行深拷贝时,需要确保对象中不存在循环引用,否则会导致栈溢出错误。而使用第三方库进行深拷贝时,需要注意是否存在性能问题,尤其在拷贝大型对象时。