拷贝
浅拷贝
浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用。
例如:
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
}
};
在object
中,age
就是“更深层次”的对象级别(第二层),其余为第一层,那么在浅拷贝下,将该obj
拷贝给new_obj
时,修改new_obj
的id
、name
不会改变obj
内对应属性的值,但若修改age
,则两个对象都会被修改,因为其为拷贝引用。
浅拷贝方式有以下两种:
- 对应属性分别用
=
赋值。 Object.assign(target, source)
方法
深拷贝
相对于浅拷贝,深拷贝则对每一级的数据均进行拷贝。
同样以上面的object
为例,在深拷贝下,尽管修改new_object
的age
属性,也不会影响obj
。
深拷贝按照如下顺序进行:
- 判断该属性是否为数组或对象类型。若是,递归地进行拷贝操作。
- 否则,该属性为简单数据类型,直接进行拷贝。
实例:
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型
// 1. 获取属性值 oldobj[k]
var item = oldobj[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k], item)
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {};
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item;
}
}
}