1.賦值的概念: (文字一定要在腦子里深深咀嚼)
當我們把一個對象賦值給一個新的變量的時候,賦的其實是該對象在棧中的地址而不是堆中的數據,也就是兩個對象指向的是同一個存儲空間,無論哪個對象發生改變,其實都是改變存儲空間的內容,因此,兩個對象是聯動的
let obj = {
name:'nn',
hobbies:['唱歌','跳舞']
}
let objOne = obj
console.log(obj)
console.log(objOne )
//打印這兩個值總是一樣的
2.淺拷貝的概念: (文字一定要在腦子里深深咀嚼)
重新在堆中創建內存,拷貝前后對象的基本數據類型互不影響,但拷貝前后對象的引用類型因共享一塊內存會相互影響
function shallowCopy(obj) {
let target = {} //新創建的對象
for(let i in obj) {
if(obj.hasOwnProperty(i)) {
target[i] = obj[i]
}
}
return target
}
3.深拷貝的概念: (文字一定要在腦子里深深咀嚼)
從堆內存中開辟一個新的區域存放對象,對對象中的子對象進行遞歸拷貝,拷貝前后的兩個對象互不影響
function deepCopy(obj) {
let clone = {}
if(obj === null) return obj
if(obj instance Date) return new Date(obj)
if(obj instance RegExp) return new RegExp(obj)
if(typeof obj != 'object') return obj
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
clone[i] = deepCopy(obj[i]) //遞歸調用
}
}
return clone
}