在 JavaScript 中实现深拷贝(deep clone)主要有以下几种方式:
- JSON.parse(JSON.stringify(obj)):将对象序列化后再反序列化,实现深拷贝。但是此方法无法拷贝函数、循环引用等。
let obj = {
a: 1,
b: [1, 2, 3],
c: {
d: 1
}
}
let clone = JSON.parse(JSON.stringify(obj));
- 递归拷贝:采用递归的方式逐层拷贝对象和数组。
function clone(obj) {
if (obj === null) return null;
if (typeof obj != 'object') return obj;
let cloneObj = obj instanceof Array ? [] : {};
for (let key in obj) {
cloneObj[key] = clone(obj[key]);
}
return cloneObj;
}
- ES6 的 Object.assign():可以实现浅拷贝,连嵌套的对象也一起拷贝。
let clone = Object.assign({}, obj);
- 展开语法 … : ES6 中的展开语法可以实现浅拷贝。
let clone = { ...obj };
- lodash 的 _.cloneDeep():lodash 实现的深拷贝函数,可以完整拷贝一个对象。
let clone = _.cloneDeep(obj);
所以,总结来说 JavaScript 中实现深拷贝的主要方式有:
- JSON.parse(JSON.stringify(obj)):简单但存在局限性
- 递归拷贝:复杂但功能完备
- Object.assign():浅拷贝,嵌套对象也拷贝
- 展开语法 … :也是浅拷贝
- lodash 的 _.cloneDeep():功能强大的深拷贝函数