深拷貝

白月光在照耀,你才想起她的好 ------即將擁有八塊腹肌的程序員

使用深拷貝必須要知道他的使用場景,一般在多人開發(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)然還有很多好用的插件也可以達到深拷貝的目的,這里就不一一枚舉了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、棧內(nèi)存與堆內(nèi)存 棧內(nèi)存與堆內(nèi)存 、淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。 1、棧與棧...
    偶爾平凡_偶爾閱讀 195評論 0 0
  • 前置知識: ????說到深淺拷貝首先要了解的知識是數(shù)據(jù)類型,那么js中會有兩個數(shù)據(jù)類型分別是 基本類型 和 引用類...
    船長___閱讀 760評論 0 7
  • 目錄 一.數(shù)據(jù)類型 二.淺拷貝與深拷貝 三.賦值和淺拷貝的區(qū)別 四.淺拷貝的實現(xiàn)方式 五.深拷貝的實現(xiàn)方式 一.數(shù)...
    我跟你蔣閱讀 404評論 0 2
  • 一、數(shù)據(jù)類型 數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean, Null, Undefine...
    Ferrari1001閱讀 234評論 0 0
  • 參考的博客 深拷貝與淺拷貝區(qū)別:簡單來說,b復(fù)制了a,改變a,如果b也發(fā)生變化,則是淺拷貝。如果b沒有變,則是深拷...
    haha2333閱讀 848評論 0 1

友情鏈接更多精彩內(nèi)容