1浅拷贝:只拷贝第一层属性,更深层次的属性是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
注意:当内存销毁的时候,指向对象的指针,必须重新定义,才能够使用;改变更深层次赋值对象的属性时,原对象的属性也会改变
方法一:遍历对象for (var k in obj){}
方法一:遍历对象for (var k in obj){}
```javascript
let obj = {
uname: 'zs',
age: 22,
msg: {
sex: '男'
}
}
let o = {}
for (let k in obj) {
o[k] = obj[k]
}
// o.msg.sex = '女'
console.log(o);
改变o.msg.sex时,obj里面的值也会变
方法二:Object.assign(o, obj); assign es6新增语法糖,第一个参数为拷贝后的对象,第二个参数为要拷贝的对象
打印结果:
let obj = {
uname: '张三',
age: 18,
msg: {
sex: '男'
}
}
let o = {}//可为空,可不为空
Object.assign(o, obj); //ES6新增语法糖
console.log(o);
o.uname = '李四'
o.msg.sex = '女'
console.log(o);
console.log(obj); //浅拷贝会改变原来的数据 有就覆盖,没就添加
因为uname属性是第一层的,因此修改uname属性后并没有改变原对象的uname值,但是sex属性在msg对象中,属于深层次的,由于浅拷贝只拷贝了地址,因此改变了msg里面的sex后,原对象中的sex属性值也发生了变化;
2,深拷贝:拷贝多层,开辟一个独立的空间,将所有东西都拷贝进来,
方法1:
let o1 = {}
deepCopy(o1, obj)
o1.msg.sex = '女'
console.log(o1);
console.log(o);
function deepCopy(newobj, oldobj) {
for (let k in oldobj) {
//先判断数据类型
//1,获取属性值 oldobj[k]
let item = oldobj[k];
//2先判断是否为数组
if (item instanceof Array) {
newobj[k] = [];
deepCopy(newobj[k], item) //再次遍历,遍历的是数组 把值给属性
// 3,判断是否为对象
} else if (item instanceof Object) {
newobj[k] = {};
deepCopy(newobj[k], item) //再次遍历,遍历的是对象 把值给属性
} else {
//简单数据类型
newobj[k] = item;
}
}
}
方法2:更简单
let o2 = {}
let str = JSON.stringify(obj);
o2 = JSON.parse(str);
o2.name = 'ls'
console.log(o2);
由于是深拷贝,所以改变深层的属性值也不会对原对象内容进行改变;