zoukankan      html  css  js  c++  java
  • 对象的深拷贝和浅拷贝

    const obj = {

      a: 'hello',

      b: {

        a: 'hello',

        b: 'world'

      },

      c: ['good', 'good','study'],

      d: function() {

        console.log('hello world')

      }

    }

    对象的浅拷贝

    方法一:(for in循环)

    function simpleCopy (data) {
    
      let newObj = {};
    
      if (data) {
    
        for (let i in data) {
    
          newObj[i] = data[i]
        }
        return newObj;
      }
    
    }
    
    const newObj = simpleCopy(obj);
    
    newObj.b.a = 'newObj';
    
    console.log(obj.b.a)         // 返回 {a: 'newObj',b: 'world'}

    方法二:

    const newObj = new assign({},obj);

    以上的两种方法在拷贝对象的时候,都存在以下的不足:

    缺点:当对象的value为对象时,被拷贝的对象的值发生变化时,原先对象的值也会发生变化

    对象的深拷贝

    方法一:

    function deepCopy (obj) {
    
      let newObj  = {};
    
      if (obj) {
    
        newObj = JSON.parse(JSON.stringify(obj));
      }
    
      return newObj;
    
    }

    缺点: 当对象的value为函数的时候,这个方法无法解析

    方法二:

    function deepCopy(initObj, finalObj) {
    
      let obj = finalObj || {};
    
      if (obj) {
    
        for (let i in initObj) {
    
          if (initObj[i] === obj) {   // 避免相互引用出现的死循环
    
            continue;
          }
          if (typeof initObj[i] === 'object') {
    
            obj[i] = (initObj[i].constructor === Array) ? [] : {};
            arguments.callee(initObj[i], obj[i])
          } else {
    
            obj[i] = initObj[i]
          }
        }
        return obj;
      }
    
    }

    注: 比较理想的方法

  • 相关阅读:
    通过actionlib控制jaco机械臂
    actionlib学习
    配置 jaco机械臂 ros环境
    ubuntu14.04标题栏显示上下网速
    linux下alsa架构音频驱动播放wav格式文件
    ros语音交互(五)移植科大讯飞语音识别到ros
    ubuntu14.04 wifi驱动
    Ubuntu14.04使用apt-fast来加快apt-get下载的教程
    ROS语音交互(四)接入图灵语义理解
    相比传统游戏,区块链游戏的价值在哪里?
  • 原文地址:https://www.cnblogs.com/cn-andy/p/9466935.html
Copyright © 2011-2022 走看看