美文网首页
js 深浅拷贝

js 深浅拷贝

作者: McDu | 来源:发表于2021-03-10 17:41 被阅读0次

深拷贝

function deepCopy (obj) {
    if(!obj || typeof obj !== 'object') {
        return;
    }
    
    let res = Array.isArray(obj) ? [] : {};
    
    for(const key in obj) {
        if(obj.hasOwnProperty(key)) {
            const val = obj[key];
            res[key] = typeof val === 'object' ? deepCopy(val) : val;
        }
    }

    return res;
}

更好的写法:

function deepCopy(obj) {

  function isObject(o) {
      return (typeof o === 'object' || typeof o === 'function') && o !== null
  }
  
  if(!isObject(obj)) {
    return;
  }

  let newObj = Array.isArray(obj) ? [] : {};

  Reflect.ownKeys(obj).forEach(key => {
      const val = obj[key];
      newObj[key] = isObject(val) ? deepCopy(val) : val
  });
  
  return newObj;
}

深拷贝循环引用

1、通过闭包维护一个变量,变量中储存已经遍历过的对象
2、每次递归时判断当前的参数是否已经存在于变量中,如果已经存在,就说明已经递归过该变量,就可以停止这次递归并返回上次递归该变量时的返回值

function deepCopy(obj) {
  let visitedObjs = [];

  function baseClone(target) {
      if(!obj || typeof obj !== 'object') {
        return target;
    }
    
    for(let i = 0; i < visitedObjs.length; i++) {
      if(visitedObjs[i].target === target ) {
        return visitedObjs[i].result;
      }
    }

    let result = Array.isArray(target) ? [] : {};
    
     visitedObjs.push({target , result})
      Reflect.ownKeys(obj).forEach(key => {
      const val = obj[key];
      result[key] = isObject(val) ? baseClone(val) : val
    });
    return result;
  }
  return baseClone(obj);
}

浅拷贝

function deepCopy (obj) {
    if(!obj || typeof obj !== 'object') {
        return;
    }
    
    let res = Array.isArray(obj) ? [] : {};
    
    for(const key in obj) {
        if(obj.hasOwnProperty(key)) {
            const val = obj[key];
            res[key] = val;
        }
    }

    return res;
}

浅拷贝,还可以用 Object.assign 、展开运算符 ...

相关文章

  • JS文集的目录

    js基础心法 深浅拷贝(递归)深浅拷贝(首层浅拷贝) js 数据处理 数组对象查找的常见操作数组对象去重的常见操作...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • js深浅拷贝

    项目中,一般会用loadsh库,地址:https://github.com/lodash/lodash 浅拷贝方法...

  • js 深浅拷贝

    浅拷贝 是 把对象或者数组的第一层 key 或者 索引 赋到 新的 对象或者对象上 深拷贝是迭代浅拷贝的操作,也就...

  • js 深浅拷贝

    深拷贝 更好的写法: 浅拷贝 浅拷贝,还可以用 Object.assign 、展开运算符 ...

  • JS深浅拷贝

  • JS深浅拷贝

    JS存储方式 JS中存在基本数据类型和引用数据类型1.基本数据类型:number,string,boolean,n...

  • JS深浅拷贝

    浅拷贝 浅拷贝的意思就是只复制引用,而未复制真正的值。 深拷贝 深拷贝就是对目标的完全拷贝,不像浅拷贝那样只是复制...

  • JS 深浅拷贝

    START 番茄我又又又来写点啥啦。 最近敲代码,总是遇到需要修改数据,在前端展示。但是最后并不想修改原数据的情况...

  • JS 深浅拷贝

    https://blog.csdn.net/flyingpig2016/article/details/52895620

网友评论

      本文标题:js 深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/vtvydxtx.html