Skip to content
On this page

深克隆与浅克隆

TIP

深克隆浅克隆是前端人必须掌握的知识,他不是说面试的时候会到问他,是关乎到你写的程序是否会发生错误。浅克隆是克隆一层数据,更改第二层数据的时候就会影响到原始数据了。深克隆是深度拷贝一个数据,跟原始数据没有什么关系,不会相互受影响。

浅克隆

TIP

在对象和数组的方法常遇到的浅克隆api: 有Object.assign(数组/对象)...(扩展运算符(数组/对象)concat(数组)slice(数组)。就列举下吧,就不多写示例了,用的时候⚠️。

深克隆

TIP

常见的深克隆有JSON.parse(JSON.stringify(数组/对象)),还有递归把一个数组/对象放到一个新的对象/数组里面实现cloneDeep

JSON.parse(JSON.stringify())

WARNING

优点: 可以快速实现一个深克隆,方便省事。缺点: 如果对象或者数组中有函数,在克隆过程中会丢失

示例:

js
// 这个样深克隆实现没问题。
const originObject = { name: 1, age: 1 };
const targetObject = JSON.parse(JSON.stringify(originObject));

// 带函数的对象
const originObjectFn = { name: 1, age: 1, fn(){} };
const targetObjectFn = JSON.parse(JSON.stringify(originObjectFn));

console.log(targetObjectFn, 'targetObjectFn');
// 这个时候会发现fn方法丢失。

实现一个cloneDeep方法。

TIP

cloneDeep方法是咱们工作中使用最的克隆手段,咱们一起看看他的实现。

示例:

js
function cloneDeep(source) {
  //判断它是数组 还是对象  定义一个新的数组或者对象
  const target = Array.isArray(source) ? [] : {};

  for (const key in source) {
    if (source.hasOwnProperty(key)) { // 检测是否有该属性
      if (source[key] && typeof source[key] === "object") {
        target[key] = cloneDeep(source[key]); // 递归
      } else {
        target[key] = source[key];
      }
    }
  }

  return target
}

Released under the MIT License.