深拷贝与浅拷贝

[TOC]

首先深拷贝和浅拷贝只针对像 Object, Array 这样的复杂对象的。简单来说,浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级。

浅拷贝:
快速浅拷贝数组方法:copy = array.slice();
ES5中浅拷贝:mixin(destObj,sourseObj.prototype);
ES6中新增:Object.assign(destObj,sourseObj.prototype);

1
2
3
4
5
6
7
8
9
10
11
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;
}

复制的arr属性的值是个引用,改变它的值会引起原来的obj中该值也会变。

深拷贝:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var cloneObj = function(obj){
var str, newobj = obj.constructor === Array ? [] : {};
if(typeof obj !== 'object'){//如果值不是对象,直接返回
return;
} else if(window.JSON){
str = JSON.stringify(obj), //系列化对象
newobj = JSON.parse(str); //还原
} else {
for(var i in obj){
newobj[i] = typeof obj[i] === 'object' ? cloneObj(obj[i]) : obj[i];
}
}
return newobj;
};

热评文章