浅拷贝:只拷贝最外面层的拷贝方式
深拷贝:所有层都拷贝的方式
观察以下代码,我们可以看到,作为键值对出现的数据,其中,uname,age,sex是基本类型,进行值传递,而color,message是引用类型,进行地址传递
let obj = {
uname : '猫',
age : 1,
sex : '公',
color : ['red', 'black', 'yellow', 'pink'],
message : {
index : 1,
score : 99
}
}
浅拷贝:
let obj = {
uname : '猫',
age : 1,
sex : '公',
color : ['red', 'black', 'yellow', 'pink'],
message : {
index : 1,
score : 99
}
}
let newObj = {};
Object.assign(newObj, obj); //拷贝
obj.message.score = 10;//新的也会更改
console.log(obj, newObj);
浅拷贝只能拷贝基本数据类型,复杂一点的,因为值传递的原因,更改原本的obj复杂类型的值,newObj的值也会改变,构不成拷贝
深拷贝:
let obj = {
uname : '猫',
age : 1,
sex : '公',
color : ['red', 'black', 'yellow', 'pink'],
message : {
index : 1,
score : 99
}
}
let newObj = {};
function Copy (newObj, obj) {
for ( let key in obj ) {
if ( obj[key] instanceof Array ) {// obj[key] 是数组
// obj[key]是数组,遍历
newObj[key] = [];
Copy(newObj[key], obj[key]); //递归
} else if ( obj[key] instanceof Object ) { // obj[key]是对象
// obj[key]是对象,遍历
newObj[key] = {};
Copy(newObj[key], obj[key]);
} else {
newObj[key] = obj[key];
}
}
}
Copy(newObj, obj);
obj.message.score = 123;
console.log( obj, newObj );
深拷贝是所有数据类型都可以拷贝