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;
      }
    
    }

    注: 比较理想的方法

  • 相关阅读:
    笔记04_正确使用Heterogeneous元件
    java网络通信:伪异步I/O编程(PIO)
    java网络通信:异步非阻塞I/O (NIO)
    lua源码学习篇二:语法分析
    lua源码学习篇三:赋值表达式解析的流程
    java网络通信:netty
    lua源码学习篇一:环境部署
    lua源码学习篇四:字节码指令
    java网络通信:同步阻塞式I/O模型(BIO)
    前端项目开发流程
  • 原文地址:https://www.cnblogs.com/cn-andy/p/9466935.html
Copyright © 2011-2022 走看看