概念
浅拷贝
只把复杂类型数据的第一层做复制操作,深层次数据依然会相互影响
Object.assign( 新对象, 老对象)
把老对象第一层的数据拷贝一份给新对象,深层次的数据新、老对象依然会相互影响
深拷贝
把复杂类型数据中包含的所有数据都做复制操作,赋值之后不会相互影响
浅拷贝
如果是简单数据类型,改变值,另一个不会变,
如果是复杂数据类型,它是一个对象或者数组,里面存储空间是通过它的地址(在一个空间里),如果更改值,另外一个也会改变
// 浅拷贝只拷贝一层,更深层次对象级别的只拷贝引用
// 深拷贝拷贝多层,每一级别的数据都会拷贝
var obj = {
id: "1",//简单数据类型
name: "andy", //简单数据类型
msg: { //复杂数据类型
age: 18
}
}
var o = {};
// for (var k in obj) {
// // k 是属性名 obj[k] 属性值
// o[k] = obj[k];
// }
// console.log(o);
// o.msg.age = 20;
// console.log(obj);
console.log('----------------');
// Object.assign('新对象','旧对象')
Object.assign(o, obj); //语法糖
console.log(o);
o.msg.age = 20;
console.log(obj);
//深拷贝
深拷贝拷贝多层,每一级别的数据都会拷贝
// 封装一个函数接收新数组和旧数组的数据
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 Function) {
//如果是就把旧函数值的值传入新的函数
newobj[k] = item;
// 判断下旧的属性值是不是一个对象
}else if (item instanceof Object) {
//如果是就把旧对象值的值传入新对象
newobj[k] = {};
deepCopy(newobj[k], item);
//最后把旧的简单数据类型的值给新对象
} else {
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o);
var arr = [];
console.log(arr instanceof Array);
o.msg.age = 20;
console.log(obj);
//注意 数组判断必须写到对象的前面,因为数组它也是一个对象,如果在后面,会跟对象判断重合