赋值
- 把一个对象的地址赋值给另一个变量
- 两个变量操作同一个空间
var o1={
name:'jack'
}
var o2=o1;
o2.name='rose'
console.log(o1,o2);
浅拷贝
- 把对象里面的每一个成员,复制一份一模一样的内容,放到另一个对象里面
- 当对象里有一个对象成员是复杂数据类型时,这个成员依旧是一样的
- 浅拷贝只是操作对象里面的一层可以没有关系,如果再深层次就会出现问题了
var o1={
name:'jack',
age:18,
info:{
a:1,
b:2
}
}
var o2={};
for(var i in o1){
o2[i]=o1[i]
}
console.log(o1,o2)
o2.name='jiayou'
o2.info.a='new Value';
console.log(o1,o2);
var o1={
name:'jack',
age:18,
info:{
a:1,
b:2
}
}
let o2={...o1}
o2.age=66;
o2.info.a='哈哈哈';
console.log(o1,o2)
var a=[1,2,[3,4]]
var c=[];
var b=c.concat(a);
b[0]=5;
b[2][0]=6;
console.log(b[0]);
console.log(a[0])
console.log(b[2][0]);
console.log(a[2][0])
深拷贝
- 对象空间里面不管有多少层,都是相对独立的,没有关系
- 深拷贝的实现方式1:
- 使用for in遍历赋值:
- 只要碰到某一个是复杂数据类型 对象或数组,再次进入到这个数据类型里面进行二次遍历,如果还有就在进入遍历。(太麻烦,不推荐)
- 深拷贝实现方式2:
- 使用json:
- 不管多复杂的数据类型,转换为json以后就是字符串了,字符串的赋值是基本数据类型,赋值以后再转换回来
- 【注意】Json的方式实现深拷贝是有局限性的,函数在专为json字符串时是会被忽略
var o1={
name:'jack',
age:18,
info:{
a:1,
b:2
}
}
var obj=JSON.stringify(o1);
var o2=JSON.parse(obj);
o2.info.a=88;
console.log(o1,o2)