一. 賦值:
當(dāng)把一個對象a賦值給另外一個對象b時,賦的值是對象a在棧中的地址,而不是堆中的數(shù)據(jù)。
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指向同一地址,無論哪個對象發(fā)生改變,另外一個對象都會聯(lián)動變化.
淺拷貝:
淺拷貝它會創(chuàng)建一個新對象,不會指向同一個地址,只會賦值制對象的非對象屬性
(如果屬性是基本類型,拷貝的就是基本類型的值;如果屬性是內(nèi)存地址(引用類型),拷貝的就是內(nèi)存地址)
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對象的值發(fā)生改變,name未受影響。
因?yàn)?,name是基本類型,p2改變自身值,person 不會改變;而score是一個對象,為引用類型,p2拷貝的是該對象的地址,與person指向同一個地址,所以p2改變score對象的值時,person也發(fā)生變化。
深拷貝:
深拷貝會另外拷貝一份一個一模一樣的對象,但是不同的是會從堆內(nèi)存中開辟一個新的區(qū)域存放新對象,新對象跟原對象不再共享內(nèi)存,修改賦值后的對象不會改到原對象。
遞歸方法實(shí)現(xiàn)深度克隆
/**
* 深拷貝
* @param {Object} obj 要拷貝對象
*/function deepClone(obj = {}) {
if (typeof obj !== 'object' || obj == null) {
// 不是對象,或者是null
return obj }
//初始化返回結(jié)果
let result if (obj instanceof Array) {
result =[]
}else{
result = {}
}
for (const key in obj) {
//保證key不是原型的屬性
if (obj.hasOwnProperty(key)) {
//遞歸調(diào)用!!
result[key] = deepClone(obj[key])
}
}
//返回結(jié)果
return result}