浅拷贝:
浅拷贝只是拷贝一层, 更深层次对象级别的只拷贝引用. 不拷贝地址 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(o, obj);//浅拷贝的语法糖
console.log(o);
o.msg.age = 20;
console.log(obj);
结果
id: 1,
name: 'andy',
msg: {
age: 20
}
浅拷贝修改的话,原来的对象也被修改,他们共用一个地址;
深拷贝:
<script>
// 深拷贝拷贝多层, 每一级别的数据都会拷贝.
var obj = {
id: 1,
name: 'andy',
msg: {
age: 18
},
color: ['pink', 'red']
};
var o = {};
// 封装函数
function deepCopy(newobj, oldobj) {
for (var k in oldobj) {
// 判断我们的属性值属于那种数据类型 对象复杂,简单类型
// 1. 获取属性值 oldobj[k]
//item 属性值
var item = oldobj[k];
// 2. 判断这个值是否是数组
if (item instanceof Array) {
//新对象的对象是一个数组
newobj[k] = [];
//相当于0.color=[];
deepCopy(newobj[k], item)//递归
} else if (item instanceof Object) {
// 3. 判断这个值是否是对象
newobj[k] = {};
deepCopy(newobj[k], item)
} else {
// 4. 属于简单数据类型
newobj[k] = item;
}
}
}
deepCopy(o, obj);
console.log(o);
var arr = [];
console.log(arr instanceof Object);
o.msg.age = 20;
console.log(obj);
</script>
深拷贝拷贝多层, 每一级别的数据都会拷贝.