Javascript中的深拷貝和淺拷貝
數據復制是我們編程中經常會使用到的技術,對于普通數值數據來說,復制很簡單,但是對于復雜類型比如對象的復制,就會有很多需要考慮的東西,比如我們經常說到的深拷貝和淺拷貝。
淺拷貝
復制的對象和原始對象屬性相關聯。事實上,如果對象的任何字段被其他對象引用,則它們共享相同的內存地址。
深拷貝
與淺拷貝不同,深拷貝復制對象的所有屬性,并且為新對象分配新的內存地址,我們對新對象的操作不會影響到原對象,看起來就像是將原對象所有的東西都重新復制出來一份。
數據類型
JavaScript中的數據類型分為原始數據類型和復合數據類型。
數值,字符串,布爾值,undefined,null為原始數據類型,而數組和對象則是復合類型。
原始數據進行復制克隆的時候,永遠都是新的副本,不會和原來數據進行關聯,而復合數據進行淺拷貝的時候,只是分配值的引用。
創建深拷貝
對于克隆對象,如果我們想要進行深拷貝,那么我們經常使用的方法就是JSON.parse()和JSON.stringify()。
數組Map,ForEach和Slice
對于普通的一維數組,函數Map,ForEach,Slice都提供深拷貝的功能,但是對于嵌套數組,這些函數對于內部數組的處理不提供深拷貝的功能。
總結
Object.assign和Object.create都可以進行對象的復制。
使用assign方法時,我們必須確保對象至少復制第二個參數。通常你只會傳遞一個空對象作為第一個參數。它不提供類似于擴展運算符的完整拷貝。
使用create方法時,現有對象作為新創建對象的原型創建一個新對象。現有對象作為原型可用,從而使所有屬性都可用于新對象。但就復制而言,它提供了部分深復制,如分配和擴展運算符。
在 JavaScript 中復制對象的唯一陷阱是嵌套值。