推荐答案
实现深拷贝有多种方式,这里提供几种常见的方法:
方法一:递归复制
递归复制是一种简单但是常用的深拷贝实现方式。基本思路是遍历对象的每个属性,如果属性值是一个对象,则递归调用该方法进行复制。
function deepClone(obj) {
// 判断是否是引用类型
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let result;
if (Array.isArray(obj)) {
result = [];
for (let i = 0; i < obj.length; i++) {
result.push(deepClone(obj[i]));
}
} else {
result = {};
for (let key in obj) {
result[key] = deepClone(obj[key]);
}
}
return result;
}
方法二:使用 JSON 对象
如果数据不包含函数、循环引用等特殊情况,可以使用 JSON 对象的 stringify 和 parse 方法来实现深拷贝。该方法的基本思路是将对象序列化为 JSON 字符串,再将 JSON 字符串反序列化为新的对象。
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
需要注意的是,该方法不能正确处理函数、循环引用等特殊情况。
方法三:使用第三方库
如果项目中使用了第三方库,可以使用该库提供的深拷贝方法,如 Lodash 库提供的 cloneDeep 方法。
const _ = require('lodash');
const obj = { a: 1, b: { c: 2 } };
const clonedObj = _.cloneDeep(obj);
使用第三方库的优点是不需要自己实现深拷贝方法,可以直接调用现成的方法。但是需要注意库的引入和使用方法。
其他答案
-
进行深拷贝的方法:递归函数 (推荐使用,项目中使用的更多,更小,更安全)JSON.stringify() 和JSON.parse() ; (不推荐使用,如果遇到Function,Date等类型的变量容易出现一些意料之外的问题),第三方库lodash的cloneDeep()方法 (就情况而定,如果项目中原先就有lodash这个第三方库,可以使用,否则还是推荐使用递归函数。不然成本太高。),JQuery的extend()函数 (推荐在JQuery项目中使用,其他项目依然推荐是用递归函数)
-
JavaScript中的对象赋值操作是浅拷贝,即当使用赋值操作符(=)将一个对象赋值给另一个对象时,实际上是将它们的引用指向了同一个对象。如果修改其中一个对象的属性,另一个对象的属性也会随之改变,为了避免这种情况,可以使用深拷贝复制一个对象,即将一个对象及其所有属性的副本复制到一个新对象中。