上一章我們利用JSON.stringify()與JSON.parse()方法實現了深拷貝,但是這種方法存在很多弊端,如對象的屬性值是函數時,無法拷貝;不能解決循環引用的問題;無法拷貝特殊對象,比如:RegExp、BigInt、Date、Set、Map等。這一章我們來詳細介紹一下深拷貝與淺拷貝。
首先要知道,js中數據類型分為基本數據類型 (Number, String, Boolean, Null, Undefined, Symbol)和對象數據類型 ( Object ),像 Array、Function、Date...等都屬于 Object,它們的值都是對象。
引用數據型在被創建時,首先要在棧上給其引用分配一塊內存,而對象的具體信息都存儲在堆內存上,然后由棧上面的引用指向堆中對象的地址。當尋找引用值時,解釋器會先尋找棧中的地址。然后根據地址找到堆內存的實體。
淺拷貝是會將對象的每個屬性進行依次復制,但是當對象的屬性值是引用類型時,實質復制的是其引用,當引用指向的值改變時也會跟著變化。而深拷貝則是層層拷貝,會另外創造一個一模一樣的對象,新對象跟原對象不共享內存。我們常用的拷貝數組的方法,如concat()、slice()、Array.from(),都是淺拷貝,除此之外,數組的其他方法如map()、filter()、reduce(),都是會造成淺拷貝的。
要實現淺拷貝,可以利用Object.assign方法或for in方法。
而上一章提到的實現深拷貝的方法,除了利用JSON.stringify()與JSON.parse()方法外,最好的辦法是利用遞歸實現??梢越鉀QJSON方法所遺留的弊端。
上一篇: 利用深拷貝實現關鍵詞搜索功能
下一篇: css——flex彈性布局詳解