Js对象深拷贝

Posted 张长长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Js对象深拷贝相关的知识,希望对你有一定的参考价值。

function deepCopy(data, hash = new WeakMap()) {
      if(typeof data !== \'object\' || data === null){
            throw new TypeError(\'传入参数不是对象\')
        }
      // 判断传入的待拷贝对象的引用是否存在于hash中
      if(hash.has(data)) {
            return hash.get(data)
        }
      let newData = {};
      const dataKeys = Object.keys(data);
      dataKeys.forEach(value => {
         const currentDataValue = data[value];
         // 基本数据类型的值和函数直接赋值拷贝 
         if (typeof currentDataValue !== "object" || currentDataValue === null) {
              newData[value] = currentDataValue;
          } else if (Array.isArray(currentDataValue)) {
             // 实现数组的深拷贝
            newData[value] = [...currentDataValue];
          } else if (currentDataValue instanceof Set) {
             // 实现set数据的深拷贝
             newData[value] = new Set([...currentDataValue]);
          } else if (currentDataValue instanceof Map) {
             // 实现map数据的深拷贝
             newData[value] = new Map([...currentDataValue]);
          } else { 
             // 将这个待拷贝对象的引用存于hash中
             hash.set(data,data)
             // 普通对象则递归赋值
             newData[value] = deepCopy(currentDataValue, hash);
          } 
       }); 
      return newData;
  }

以上是关于Js对象深拷贝的主要内容,如果未能解决你的问题,请参考以下文章

js对象深拷贝

JS中如何进行对象的深拷贝

JS深拷贝数组和对象

js的浅拷贝和深拷贝

JS基础 - 手写深拷贝

js 对象的浅拷贝和深拷贝