• javascript 拷贝


    拷贝简单分为浅拷贝与深度拷贝,即给定一个对象,生成一个相同的对象。

    浅拷贝

    function copy(source,destiny){
      destiny = destiny || {};
      if(typeof(source) === 'object'){  //  是object或者array
        for(var i in source){
        if(source.hasOwnProperty(i)){
          destiny[i] = source[i];
        }
       }
      }else{  //string number boolean,undefined null
        destiny = source;
      }
      
      return destiny;
    }
    

      简单测试一下:

    var ls = {
      a:12,
      b:22,
      c:{
        c1:1,
        c2:2
      }
    };
    var ld = copy(ls);
    console.log(ld);
    

      结果:

    [object Object] {
      a: 12,
      b: 22,
      c: [object Object] {
        c1: 1,
        c2: 2
      }
    }
    

      但是,如果改变新生成对象的值,再查看一下source对象

    ld.c.c1=3;
    console.log(ls);
    [object Object] {
      a: 12,
      b: 22,
      c: [object Object] {
        c1: 3,
        c2: 2
      }
    }
    

      发现source对象也被改变,说明,对于复杂对象(key对应的value值为对象),进行浅拷贝,key对应的使用的是同一个引用,很容易引起问题。

    深拷贝

    function deepCopy(source,destiny){
      destiny = destiny || {};
      var i;
      for( i in source){
        if(source.hasOwnProperty(i)){
          if(typeof(source[i]) === "object"){
            destiny[i] = Object.prototype.toString.call(source[i]) === "[object Array]" ? [] : {};
             deepCopy(source[i],destiny[i]);    //递归调用
          }else{
            destiny[i] = source[i];
          }
        }
      }
      return destiny;
    }
    

      测试一下:

    var s = {
      a:1,
      b:{
        b1:2,
        b2:3
      },
      c:[4,5]
    };
    var d = deepCopy(s);
    

      

    [object Object] {
      a: 1,
      b: [object Object] {
        b1: 2,
        b2: 3
      },
      c: [4, 5]
    }
    

      

    d.b.b1=22;
    console.log(s);
    

      console.log(s)对应的值:

    [object Object] {
      a: 1,
      b: [object Object] {
        b1: 2,
        b2: 3
      },
      c: [4, 5]
    }
    

      测试地址 : http://jsbin.com/higijadatalu/1/edit

  • 相关阅读:
    Java——多线程之方法详解
    Java——深入理解Java异常体系
    Java——Java代码的执行顺序
    Java——抽象类与接口的前世今生
    存储系列之 LUN 和 LVM
    存储系列之 RAID技术原理简介
    存储系列之 硬盘接口与SCSI总线协议
    存储系列之 介质(软盘、硬盘、固态)和磁盘寻址
    Redis设计原理简介
    MySQL InnoDB索引介绍以及在线添加索引实例分析
  • 原文地址:https://www.cnblogs.com/teamobaby/p/4019061.html
Copyright © 2020-2023  润新知