关于深浅copy记录

228 阅读1分钟

CMS有很多过滤筛选项,需要对树形结构的对象进行备份

1、原生递归赋值

 function deepClone(obj) {
      let res = null;
      // 我们只对数组,对象进行判断
      if (Array.isArray(obj)) {
        res = [];
      }
      if (Object.prototype.toString.call(obj) === "[object Object]") {
        res = {};
      }
      if (Object.prototype.toString.call(obj) === "[object Object]" || Object.prototype.toString.call(obj) === "[object Array]") {
        for (i in obj) {
          // 在确定是数组还是对象的时候用for in 循环
          // console.log(obj[i]); // 这个无论是数组还是对象都能够获得他具体的值,之后再对它进行判断
          if (Object.prototype.toString.call(obj[i]) === "[object Object]" || Object.prototype.toString.call(obj[i]) === "[object Array]") {
            res[i] = deepClone(obj[i]);
          } else {
            // 不是数组也不是对象可以直接赋值
            res[i] = obj[i];
          }
        }
      } else {
        // 请传入需要copy的数组或对象
      }
      return res;
    }

2、转字符串:缺点是如果里面是函数,就不能用这个方法

 function deepClone(obj) {
    return JSON.parse(JSON.stringify(obj));
 }

3、其他的浅copy

Object.assign(target, sources);
// ES的展开运算符
let b = [...a];
都属于浅copy