淺拷貝和深拷貝的應用

說到這個其實要引伸出一個知識點,那即是存儲類型,簡單來講分爲值類型(又名 原始類型,六種 → string,number,null,undefined,boolean,symbol(不重複得值))和引用類型(又名 對象類型 例如 function,Array)

其中常見值類型有String、Number、Boolean、引用類型有function、Array

引用類型有this指針指向問題、因此本次說的淺深拷貝也是指引用類型

具體能夠在本博客  輸入關鍵詞  js變量按照存儲方式區分 搜索

淺拷貝 能夠經過Object.assign來解決這個問題 或者 運用 展開運算符(...)來解決

 let test = {
    name:'zachary'
 }
 let demo = test
 test.name = 'changes'
 // 其實 demo 並無變值 但確實 被test再次賦值給帶跑偏了
 console.log(demo) // changes
 console.log(test) //changes
 let test = {
    name:'zachary'
 }
 //let demo = Object.assign({},test)
 let demo = {...test}
 test.name = 'changes'

 console.log(demo) // zachary
 console.log(test) //changes 

 若是是數組也能夠這麼用 只不過要把{} 改爲[]

 let test = [1,2,3]
 let demo = Object.assign([],test)
// let demo = [...test] test.push('changes')
console.log(demo) // [1, 2, 3] console.log(test) //[1, 2, 3, "changes"]

深拷貝經過將對象轉換成字符串,以後再將它反序列化成對象 用代碼表示就是 JSON.parse(JSON.stringify())

let map = {
    city:'重慶市',
    province:{
        jangxi:'江西省'
    }
}
// let cloneMap = {...map}  對於深拷貝無效
// let cloneMap = Object.assign({},map) 對於深拷貝無效
let cloneMap = JSON.parse(JSON.stringify(map)) cloneMap.province.jangxi='changes'
console.log(cloneMap) //jangxi:changes console.log(map)//jiangxi:'江西省'

此方法的深拷貝缺陷說明

會忽略 undefined
不能序列化函數
不能解決循環引用的對象

可是在一般狀況下,複雜數據都是能夠序列化的,因此這個函數能夠解決大部分問題,而且該函數是內置函數中處理深拷貝性能最快的
相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息