• js数据处理-----数据拷贝


    一、理解深拷贝与浅拷贝

    如下代码,把 a  的值赋给  b ,修改 b 的值会直接修改到  a 的值,这叫浅拷贝。(其实他们修改的是同一个对象)

    var a = [1,2,3,4,5];
    var b = a;
    b[2] = 100;
    console.log(a);          //[1,2,100,4,5]
    console.log(b);		//[1,2,100,4,5]    
    

      把 obj1  的值赋给 obj2  ,修改 obj2 的值,不会影响到 obj1 的值  ,这叫深拷贝

    var obj1 = [1,2,3,4,5]
    var obj2 = [];
    for(var i = 0; i < obj1.length; i++){
    	obj2.push(obj1[i])
    }
    obj2[2] = 100
    console.log(obj1);      //[1,2,3,4,5]
    console.log(obj2)       //[1,2,100,4,5]
    

      

    二、深度拷贝的多种情况

    这里我列举以下几种例子,在以下的拷贝方法里也会将各种方法做一个比较,例子如下

    var obj1 = {name:"张三",age:18}	
    var obj2 = {
    	name:"王五",
    	intersects:{one:"游泳",two:"看书"},
    	getNum: function(){
    	  return 10;
    	},
    	numArr:["猫","狗","鸡"]
    }
    var arr1 = [1,2,3,4,5,"六","七"]			
    var arr2 = [
    	{name:"张三",age:18},
    	{name:"王五",age:19}
    ]
    

      方法一:转为JSON格式

    亲测:obj1,arr1,arr2 均有效,obj2无效,

    原因:这种方法的缺陷是会破坏原型链,并且无法拷贝属性值为function的属性

    var copyObj2 = JSON.parse(JSON.stringify(obj1))
    copyObj2.name = "哈哈"
    
    console.log(obj1)        //{name:"张三",age:18}	
    console.log(copyObj2)	 //{name:"哈哈",age:18}	
    

      方法二:采用递归的方式

      亲测均有效

    function copy(obj1, obj2) {
    	var obj2 = obj2 || {};
    	for(var name in obj1) {
    		if(typeof obj1[name] === "object") {
    			obj2[name] = (obj1[name].constructor === Array) ? [] : {};
    			copy(obj1[name], obj2[name]);
    		} else {
    			obj2[name] = obj1[name];
    		}
    	}
    	return obj2;
    }
    
    var copyObj2 = {}
    copyObj2 = copy(obj2,copyObj2);
    						
    copyObj2.getNum = function(){
    	return "单身狗"
    }
    			
    console.log(obj2.getNum())        //10
    console.log(copyObj2.getNum())	  //单身狗
    

      

    其他方法;

    一、假如你用jquery,可以使用$.extend()

      亲测均有效

    var copyarr = $.extend(true, [], arr1);		
    copyarr[1] = "888"
    
    console.log(copyarr);         //[1,888,3,4,5,六,七]
    console.log(arr1);	        //[1,2,3,4,5,六,七]    
    

      

    var copyarr = $.extend(true, {}, obj2);		
    copyarr.getNum = function(){
    	return "这是测试"
    }
    
    console.log(copyarr.getNum());            //这是测试
    console.log(obj2.getNum());		 //10
    

      

  • 相关阅读:
    opengl编程指南
    Binder机制1---Binder原理介绍
    [Android]使用platform密钥来给apk文件签名的命令
    IntentFilter
    最高分是多少
    Spring注入
    Bean容器的初始化
    Spring中的Junit
    IOC
    接口及面向接口编程
  • 原文地址:https://www.cnblogs.com/qqing/p/9510631.html
Copyright © 2020-2023  润新知