• js中的拷贝问题


    浅拷贝的实现

    
    // 浅拷贝函数
    var dad = {name:'chen',age:18};
    var son = {sex:'男'};
    function clone(dad,son){
      var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
     for (var prop in dad) {
        son[prop] = dad[prop];
      };
      return son;//返回s对象
    };
    
    print(clone(dad,son));
    

    打印结果:

    但是假如,对象里面有子对象

    var person = {
    	name: 'chen',
    	age:18,
    	man: {
    		hight:188
    	}
    };
    

    那么在复制时浅拷贝只是将子对象的一个引用地址复制给son对象;son和person里的man 属性都指向同一个对象,故改变任一个都能影响到另外一个:
    例子如下:

    var dad = {
    	name:'chen',
    	age:18,
    	man: { 
    		hight:188
    	}
    }
    var son = {
    	sex:'男'
    };
    // 浅拷贝函数
    function clone(dad,son){
      var son = son|| {}; //判断s对象是否存在,不存在则定义s为空对象
      for (var prop in dad){
        son[prop]=dad[prop];
      };
      return son;//返回s对象
    };
    
    clone(dad,son);  // 进行浅拷贝
    son.name='ze';
    console.log(son.name);//打印ze
    console.log(dad.name);//打印chen
    son.man.hight=1999;
    console.log(son.man.hight);//打印1999
    console.log(dad.man.hight);//打印1999
    

    打印结果:

    解决办法: 浅拷贝----->深拷贝
    深拷贝可以很好的解决引用类型的拷贝问题,采用递归的方法去复制拷贝对象,从而解决浅拷贝带来的弊端

    var dad = {
    	name:'chen',
    	age:18,
    	man: {
    		hight:188
    	}
    }
    
    var son = {
    	sex:'男'
    };
    
    // 深拷贝函数
    function clone(dad,son){
       var son = son || {};//判断s对象是否存在,不存在则定义s为空对象
       for (var prop in dad) {
    		if (typeof dad[prop]=='object') {
    			//三元运算,将s[prop]初始化为数组或者对象
    			son[prop] = (dad[prop].constructor === Array) ? [] : {};
    			clone(dad[prop],son[prop]);
    		}
    		else{
    			son[prop]=dad[prop];
    		}
    	};
    	return son;//返回s对象
    };
    
    clone(dad,son);
    son.name='ze';
    console.log(son.name);//打印ze
    console.log(dad.name);//打印chen
    son.man.hight=1999;
    console.log(son.man.hight);//打印1999
    console.log(dad.man.hight);//打印188
    

    打印结果:

    参考文档:http://www.cnblogs.com/MECN/p/6606119.html

  • 相关阅读:
    MSI文件的制作
    QPushButton 响应回车 设置默认按钮
    ubuntu 使用apt-fast 安装软件包
    apt命令集使用教程
    如何在windows下使用git及github仓库管理项目
    如何在windows下使用git及github仓库管理项目
    01. struts2介绍
    人生能跨越多少个年代
    联调踩的坑:空和空字符串引发的巨大差异
    我的亲历:一行代码,百万人民币打水漂
  • 原文地址:https://www.cnblogs.com/Yfling/p/7483909.html
Copyright © 2020-2023  润新知