zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    电商拼团系统开发思路和拼团系统开发产品设计思路
    唐古拉优选拼团系统设计模式和唐古拉优选拼团系统核心代码介绍
    计算机体系结构之三--函数的调用和返回【译】
    cxv文件合并
    ubuntu18.04安装Mono及MonoDevelop,用c#开发winform
    repo怎么都下不完,原因
    repo下载安卓源码经常掉线,解决方法
    编译ad10
    ub18.04 root账户
    安卓源码导入android studio
  • 原文地址:https://www.cnblogs.com/teamobaby/p/4019061.html
Copyright © 2011-2022 走看看