白月光在照耀,你才想起她的好 ------即將擁有八塊腹肌的程序員
使用深拷貝必須要知道他的使用場景,一般在多人開發(fā)的時候?qū)τ谝粋€公用的數(shù)據(jù),再不確定改變它是否會對其他人或者后面的開發(fā)產(chǎn)生影響的時候,這個時候深拷貝就顯得尤其重要了。
一般深拷貝都是對引用數(shù)據(jù)類型的使用,因為這跟數(shù)據(jù)存儲有關(guān)系。
這里就要引入基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的概念了。
基本數(shù)據(jù)類型:number,string,boolean,null,undefined,symbol還有BigInt(這個不太熟悉放在最后了)
引用數(shù)據(jù)類型:object,array,fuction,data等
基本數(shù)據(jù)類型名跟值都儲存在棧中
比如? let A = 1;棧會開辟一個內(nèi)存用來儲存? A和它的值 如圖:

當(dāng)let B = A;時棧會從新開辟一個內(nèi)存用來儲存B的值如圖:

因為這個原理,B 的賦值是重新開辟了內(nèi)存進行保存,所以A跟B的值并不會有聯(lián)系
引用數(shù)據(jù)類型名是儲存在棧中的而值是儲存在堆中的,棧里面還存儲著這個數(shù)據(jù)的地址,可以根據(jù)這個地址去查詢儲存在堆中的數(shù)據(jù)。如圖

A的值是儲存在堆中的而B=A通過這種方式來賦值的話是跟基本數(shù)據(jù)類型不一樣的,如圖

B只會把A儲存的地址賦值過去,并不會把堆中的數(shù)據(jù)賦值,這就導(dǎo)致了修改B的時候修改的是同一個地址指向的數(shù)據(jù),就會出現(xiàn)B改變A也跟著改變。深拷貝的原理就是在復(fù)制數(shù)據(jù)的時候要在堆內(nèi)單獨開辟新的內(nèi)存來存放新的值。
下面我們就實現(xiàn)一些簡單的深拷貝:
1.可以通過JSON.stringify與JSON.parse來進行一些簡單的深拷貝:
let newObj =?JSON.parse(JSON.stringify(obj))
2.jQuery中extend( )
jQuery.extend([deep],target,object1,[objectN]);
3.使用遞歸的方法進行深拷貝

原理就是將數(shù)據(jù)單獨分開判斷,數(shù)組和對象區(qū)別開進行賦值的過程,當(dāng)然還有很多好用的插件也可以達到深拷貝的目的,這里就不一一枚舉了。