如何在Javascript中实现数据的深拷贝?

在 JavaScript 中实现深拷贝(deep clone)主要有以下几种方式:

  1. JSON.parse(JSON.stringify(obj)):将对象序列化后再反序列化,实现深拷贝。但是此方法无法拷贝函数、循环引用等。
let obj = {
  a: 1,
  b: [1, 2, 3],
  c: {
    d: 1
  }
}
let clone = JSON.parse(JSON.stringify(obj));
  1. 递归拷贝:采用递归的方式逐层拷贝对象和数组。
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;
}
  1. ES6 的 Object.assign():可以实现浅拷贝,连嵌套的对象也一起拷贝。
let clone = Object.assign({}, obj);
  1. 展开语法 … : ES6 中的展开语法可以实现浅拷贝。
let clone = { ...obj };
  1. lodash 的 _.cloneDeep():lodash 实现的深拷贝函数,可以完整拷贝一个对象。
let clone = _.cloneDeep(obj);

所以,总结来说 JavaScript 中实现深拷贝的主要方式有:

  1. JSON.parse(JSON.stringify(obj)):简单但存在局限性
  2. 递归拷贝:复杂但功能完备
  3. Object.assign():浅拷贝,嵌套对象也拷贝
  4. 展开语法 … :也是浅拷贝
  5. lodash 的 _.cloneDeep():功能强大的深拷贝函数