深浅拷贝(对象与对象之间的关系)
1、赋值
- 定义:把一个对象的地址赋值给另外一个变量,两个变量操作同一个空间地址。
var obj1 = {
name:'Jack'
}
var obj2 = obj1
obj2.name = 'Rose'
console.log(obj1,obj2)
2、浅拷贝
- 定义:把对象里面的每一个成员,复制一份一模一样的放到另一个对象里面。
- 缺点:当对象的某一个成员是复杂数据类型的时候,这个成员的地址不会发生改变。
var obj1 = {
name:'Jack',
age:18
}
var obj2 = {}
for (let key in obj1) {
obj2[key] = obj1[key]
}
obj2.name = "我是obj2"
console.log(obj1,obj2)
3、深拷贝
- 定义:对象空间里面不管有多少层,都是相对独立的
- 实现方案1:
var obj1 = {
name: 'Jack',
age: 18,
student :{
subject: {
chinese: 100,
math: 80,
english: 60
},
score: [100, 23, 45, 57, 89]
}
};
var obj2 = {}
function deep(obj2, obj1){
for (let key in obj1) {
if (obj1[key].constructor === Array) {
obj2[key] = [];
deep(obj2[key], obj1[key]);
}
else if (obj1[key].constructor === Object) {
obj2[key] = {};
deep(obj2[key], obj1[key]);
}
else {
obj2[key] = obj1[key];
}
}
}
obj2 = JSON.parse(JSON.stringify(obj1))
obj2.class.subject.math = '数学'
obj2.class.subject.english = '英语'
obj2.class.score[20] = 'yeah'
console.log(obj1, obj2)
- 实现方案2:
原理:将复杂数据类型转换成简单数据类型(字符串)
obj2 = JSON.parse(JSON.stringify(obj1))