浅拷贝、深拷贝

浅拷贝

var a =  {name:'zhang',age:"2",per:[1,3]};
function clone(obj1){
   var obj2 = {};
    Object.keys(obj1).forEach(function(key){
        obj2[key]=obj1[key];
    });
    return obj2;
};

或者

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}

导致的结果就是:

shallowObj.arr[1] = 5;
obj.arr[1]   // = 5

深拷贝

var a = {name:'zhang',age:"2",per:[1,3]};
var b = {};
function copy(obj){
    return b = JSON.parse(JSON.stringify(obj));
}
copy(a); // 返回值b = {name:'zhang',age:"2",per:[1,3]}
b.per[1]=34; // 而a.per[1]=3;

值得注意的是用JSON的方法拷贝不了函数
例如

var a = {name:'zhang',age:"2",per:[1,3],hs:function(){}};

因为JSON数据类型不包含function
JSON数据类型有:
1、数字(整型、浮点数、定点数);
2、字符和字符串;
3、布尔类型。
还有其他数据类型:
一、对象;
二、null;
三、数组。

另外jQuery.extend(obj)

        var  
            obj1 = { a : 'a', b : 'b' },  
            obj2 = {},  
            obj3 = {  x : { xxx : 'oldValue', yyy : 'yyy' },  y : 'y' };   
        $.extend(true, obj1, obj3);   // 第一个参数为true表示执行深度复制  
        $.extend(obj2, obj3);   // deep的默认值为false,表示浅复制  
        console.log(obj1.x.xxx);  // 输出"oldValue"      
        obj3.x.xxx = 'newVlaue';   
        console.log(obj3.x.xxx);  // 输出"newValue"    
        console.log(obj1.x.xxx);  // 输出"oldValue" 因为是深度复制,所以obj1中的属性值的改变不会再obj2中得到体现  
        console.log(obj2.x.xxx);  // 输出"newValue" 因为是浅赋值,仅仅是简单的给对象多添加了一个引用而已  
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容