一. 浅拷贝
浅拷贝只是拷贝一层,更深层次对象级别的只拷贝地址(引用)
var obj = {
uname: "zly",
salary: 100000,
ff: {
age: 20,
}
}
var kao = {};
for (var k in obj) {
// k 是属性名, obj[k]是属性值
kao[k] = obj[k];
}
console.log(kao);
kao.ff.age = 30;
console.log(obj);
// 浅拷贝对于更深层次的对象级别只拷贝了地址,修改数据后,会影响原来的 被拷贝对象
浅拷贝的语法糖:
Object.assign()
var obj = {
uname: "zly",
salary: 100000,
ff: {
age: 20,
}
}
var kao = {};
Object.assign(kao, obj);
console.log(kao);
kao.ff.age = 12;
console.log(obj);`
二. 深拷贝
①深拷贝拷贝多层,每一级别的数据都会被拷贝。 ② 深拷贝中,修改对象级别中的数据时,不会影响原被拷贝对象中的数据。 (因为在拷贝被拷贝对象的对象级别的数据时,又开辟了一个新的内存地址存放数据)
var obj = {
uname: "zly",
salary: 100000,
ff: {
age: 20,
},
lucky_num: [1, 3, 5]
};
var xin = {};
// 封装函数
function deepCopy(kao, beikao) {
for(var k in beikao) {
// 判断属性值属于哪种数据类型
// 1. 获取属性值
var item = beikao[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
// 必须先判断是否是数组,再判断是否是对象(因为数组也是属于对象Object)
kao[k] = [];
deepCopy(kao[k], item);
}else if (item instanceof Object) {
// 3. 判断值是否是对象
kao[k] = {};
deepCopy(kao[k], item);
}else {
// 4. 值属于普通数据类型时
kao[k] = item;
}
}
}
deepCopy(xin, obj);
console.log(xin);
xin.ff.age = 30;
xin.lucky_num = [1, 2, 3];
console.log(obj); // 不会影响被拷贝对象的数据
检测数组是否属于对象:
var a = [];
console.log(a instanceof Object);