程序员

手写系列——JS深拷贝和浅拷贝

2020-09-22  本文已影响0人  aichisuan

不要问我心里有没有你,我余光中都是你。——余光中

image.png

一直想做个手写的专题,之前也写了一部分,后面会陆陆续续的挪到这里,今天只是写一些相对简单的手写系列,之后会有更加深入的研讨。

概念补漏

1. 堆栈的概念

在计算机中,堆栈是两种数据结构。

2.基本,引用数据类型

JavaScript不支持任何创建自定义类型的机制,而所有值最终都将是以上 8 种数据类型之一(排除之后新增)。

3.浅拷贝和深拷贝
浅拷贝:简单的说浅拷贝就是只进行一层的拷贝,对对象的属性第一层进行拷贝,不管之后的层级。
深拷贝:对对象的属性无限层级的拷贝。

代码示范

这是我觉得现在比较好的深浅拷贝方式,随着语言的发展,之后类型的增多,会有一定的增删。

// shallowCopy

const isObject = (o) => typeof o === 'object' && o !== null;

const shallowCopy = (obj) => {
  if (!isObject(obj)) return obj;

  const res = Array.isArray(obj) ? [] : {};

  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      const element = obj[key];
      res[key] = element;
    }
  }
  return res;
};
// deepCopy

const isObject = (o) => typeof o === 'object' && o !== null;

const deepCopy = (obj, weakmap = new WeakMap()) => {
  if (!isObject(obj)) return obj;
  // 解决循环引用, 防止无限遍历
  if (weakmap.get(obj)) return weakmap.get(obj);

  // 创建新对象存入weakmap
  const target = Array.isArray(obj) ? [] : {};
  weakmap.set(obj, target);

  // symbol拷贝
  const symArr = Object.getOwnPropertySymbols(obj);
  symArr.forEach((key) => {
    if (isObject(obj[key])) {
      target[key] = deepCopy(obj[key], weakmap);
    } else target[key] = obj[key];
  });

  // 对象的key
  for (const key in obj) {
    if (obj.hasOwnProperty(key)) {
      if (isObject(obj[key])) {
        target[key] = deepCopy(obj[key], weakmap);
      } else target[key] = obj[key];
    }
  }
  return target;
};

参考文档

上一篇 下一篇

猜你喜欢

热点阅读