浅拷贝
- 使用数组的一些方法,如slice, concat返回一个新数组来进行拷贝,如果数组元素是基本类型,新旧数组互不影响。如果数组元素是对象或数组,就会只拷贝对象和数组的引用,无论在新还是旧数组进行修改,两者都会发生变化。
- 浅拷贝的实现: 遍历对象,把属性和属性值都放在一个新的对象里即可。
var shallowCopy = function(obj) {
if(typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for( var key in obj) {
if(obj.hasOwnProperty(key)){
newObj[key] = obj[key];
}
}
return newObj;
}
#深拷贝
完全拷贝一个新的对象,即使嵌套了对象,两者也互相分离,修改一个对象的属性,不会影响另一个。
方法一:
var arr = ['w','e','e'];
var new_arr = JSON.parse(JSON.stringify(arr));
原理:
JSON对象中的stringify可以把一个js对象序列化为一个JSON字符串,parse可以把JSON字符串反序列化为一个js对象。但是这个方法不能拷贝函数。
方法二:
var deepCopy = function(obj) {
if(typeof obj !== 'object') return;
var newObj = obj instanceof Array ? [] : {};
for(var key in obj) {
if(obj.hasOwnProperty(key)){
newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
}
}
return newObj;
}