灏天阁

深拷贝和浅拷贝

· Yin灏

浅拷贝:只拷贝一层,更深层次对象级别只拷贝引用。

深拷贝:拷贝多层,每一级的数据都会拷贝。

var obj = {
	id: 1,
	name: 'andy'
}

var o = {};

for(var k in obj) {
	o[k] = obj[k];
}

console.log(o)

o.id = 2;

console.log(obj); // { id: 1, name: "andy" } 
/*
  浅拷贝:只拷贝一层。
*/
var obj = {
	id: 1,
	name: 'andy',
	msg: {
		age: 18
	}
}

var o = {};

for(var k in obj) {
	o[k] = obj[k];
}

o.msg.age = 20;

console.log(obj); // { id: 1, name: "andy", msg: 20 }
/*
  for...in 是浅拷贝,只能拷贝一层,
  对于深层次的拷贝,拷贝的是引用地址。拷贝后的数据改变,原数据也会改变。
*/

Object.assign() es6 新增方法可以浅拷贝。

var obj = {
	id: 1,
	name: 'andy',
	msg: {
		age: 18
	}
}
var o = {};

Object.assign(o, obj);
console.log(o);
o.msg.age = 20;
console.log(obj); // { id: 1, name: "andy", msg: 20 }

深拷贝

通过递归方式实现深拷贝。

深拷贝封装函数:

var obj = {
    id: 1,
    name: 'andy',
    msg: {
        age: 18
    },
    color: ['pink', 'red']
}
var o = {};

function deepCopy(newobj, oldobj) {
    for (var k in oldobj) {
        var item = oldobj[k];
        if (item instanceof Array) { // 这里要写在上面,因为数组也属于对象
            newobj[k] = [];
            deepCopy(newobj[k], item);
        } else if (item instanceof Object) {
            newobj[k] = {};
            deepCopy(newobj[k], item);
        } else {
            newobj[k] = item;
        }
    }
}

deepCopy(o, obj);
console.log(o);

- Book Lists -