浅拷贝
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" 因为是浅赋值,仅仅是简单的给对象多添加了一个引用而已