一. 赋值:
当把一个对象a赋值给另外一个对象b时,赋的值是对象a在栈中的地址,而不是堆中的数据。
let person ={
name:'小米',
age:16,
score:{
english:60,
math:100,
},
}
let person1 = person
person1.name='大米'
person1.score.english = 99
console.log('person',person)
console.log('person1',person1)
由此可知:对象person1和对象person指向同一地址,无论哪个对象发生改变,另外一个对象都会联动变化.
浅拷贝:
浅拷贝它会创建一个新对象,不会指向同一个地址,只会赋值制对象的非对象属性
(如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址)
let person ={
name:'小米',
age:16,
score:{
english:60,
math:100,
},
}
let p2 = {}
Object.assign(p2,person)
p2.name = "小小小米"
p2.score.math = 88
console.log('person',person);
console.log('p2',p2)
由此可知:
p2 对象改变 name的值和 score 对象,person 对象只有score对象的值发生改变,name未受影响。
因为,name是基本类型,p2改变自身值,person 不会改变;而score是一个对象,为引用类型,p2拷贝的是该对象的地址,与person指向同一个地址,所以p2改变score对象的值时,person也发生变化。
深拷贝:
深拷贝会另外拷贝一份一个一模一样的对象,但是不同的是会从堆内存中开辟一个新的区域存放新对象,新对象跟原对象不再共享内存,修改赋值后的对象不会改到原对象。
递归方法实现深度克隆
/**
* 深拷贝
* @param {Object} obj 要拷贝对象
*/function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
// 不是对象,或者是null
return obj }
//初始化返回结果
let result if (obj instanceof Array) {
result =[]
}else{
result = {}
}
for (const key in obj) {
//保证key不是原型的属性
if (obj.hasOwnProperty(key)) {
//递归调用!!
result[key] = deepClone(obj[key])
}
}
//返回结果
return result}