浅拷贝与深拷贝

129 阅读1分钟

浅拷贝

  1. 使用数组的一些方法,如slice, concat返回一个新数组来进行拷贝,如果数组元素是基本类型,新旧数组互不影响。如果数组元素是对象或数组,就会只拷贝对象和数组的引用,无论在新还是旧数组进行修改,两者都会发生变化。
  2. 浅拷贝的实现: 遍历对象,把属性和属性值都放在一个新的对象里即可。
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;
}