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

    注: 比较理想的方法

  • 相关阅读:
    day10 基本数据类型(下)
    day09 作业
    day09 基本数据类型(中)
    day08 作业
    day8 for循环+基本数据类型(上)
    Python正课109 —— 前端 进阶8
    Python正课108 —— 前端 进阶7
    Python正课107 —— 前端 进阶6
    Python正课106 —— 前端 进阶 5
    Python正课105 —— 前端 进阶4
  • 原文地址:https://www.cnblogs.com/cn-andy/p/9466935.html
Copyright © 2011-2022 走看看