Javascript和jQuery的深淺拷貝詳解
深淺拷貝在引用數(shù)據(jù)類型(數(shù)組對象)復(fù)制過程中產(chǎn)生的問題。
JS的淺拷貝
直接復(fù)制拷貝的是數(shù)組/對象的內(nèi)存地址,本質(zhì)上是一個引用數(shù)據(jù)類型,所有的變量存儲的是相同的內(nèi)存地址,操作的是同一個存儲空間,任意一個變量的操作,其他變量都會受影響。如下所示:
const arr1 = ['北京', '上海', '廣州', '深圳', '武漢']; const arr2 = arr1; console.log(arr1); console.log(arr2);
變量arr1中存儲的是數(shù)組的內(nèi)存地址,淺拷貝是將變量arr1中存儲的數(shù)組的內(nèi)存地址賦值給變量arr2存儲,也就是變量arr2和變量arr1存儲的是相同的內(nèi)存地址,通過其中一個變量操作數(shù)組,另一個變量也受影響,將arr1里的北京改為天津,那么arr2里的北京也就變成了天津。
JS的深拷貝
復(fù)制拷貝的是數(shù)組/對象存儲的數(shù)值數(shù)據(jù),本質(zhì)上執(zhí)行幾次深拷貝就有幾個獨立的引用數(shù)據(jù)類型,存儲的是不同的內(nèi)存地址,操作的是不同的存儲空間,一個變量操作引用數(shù)據(jù)類型對其他變量沒有影響,如下所示:
const arr1 = ['北京', '上海', '廣州', '深圳', '武漢']; //創(chuàng)建一個新的引用數(shù)據(jù)類型 const arr3 = []; //循環(huán)遍歷arr1將arr1中的存儲獲取之后,存儲到arr3中 arr1.forEach(item => { arr3.push( item ); })
arr3是新的內(nèi)存地址,只是存儲的數(shù)據(jù)數(shù)值和arr1相同,arr1的操作是arr1內(nèi)存地址對應(yīng)的存儲空間,和arr3的存儲空間沒有關(guān)系,也沒有影響。arr1里的上海改為成都,arr3里面的數(shù)值 不發(fā)生任何變化,所以,修改arr3里的數(shù)據(jù),arr1里也同樣沒有變化。
jQuery的深淺拷貝
jQuery中的深淺拷貝比較特殊
1、jQuery中沒有封裝傳統(tǒng)意義上的淺拷貝的函數(shù)
2、jQuery中封裝的$.extend()默認執(zhí)行的就是傳統(tǒng)意義上的深拷貝
3、jQuery中的所謂的深淺拷貝,指的是 一維數(shù)據(jù) 深拷貝,二維數(shù)據(jù) 淺拷貝
4、jQuery中深淺拷貝的語法形式
const 變量 = 數(shù)組/對象; $.extend(變量 , 原始數(shù)組/對象); //淺拷貝,一維數(shù)據(jù) 深拷貝,多維數(shù)據(jù) 淺拷貝 $.extend(true, 變量, 原始數(shù)組/對象); //深拷貝,一維數(shù)據(jù) 多維數(shù)據(jù) 都是深拷貝
如下所示:
//原始數(shù)組 const arr1 = ['北京' , '上海' , '廣州' , '深圳' , '武漢' , [100,200,300,400] , {name:'王昭沒有君啊' , age:22 , sex:'男'} ]; //jQuery的淺拷貝 //創(chuàng)建一個arr2 const arr2 = []; //將arr1中的數(shù)據(jù)按照jQuery的淺拷貝語法復(fù)制到arr2中 //執(zhí)行的是jQuery的淺拷貝 $.extend( arr2 , arr1 ); //創(chuàng)建一個arr2 const arr3 = []; //將arr1中的數(shù)據(jù)按照jQuery的深拷貝語法復(fù)制到arr3中 //執(zhí)行的是jQuery的深拷貝 $.extend(true, arr3, arr1);
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
javascript 新聞標題靜態(tài)分頁代碼 (無刷新)
一個模板,從數(shù)據(jù)庫取n條記錄,生成靜態(tài)。做單頁面的靜態(tài)化,索引頁面是用JS對數(shù)組進行組合的。2010-03-03JavaScript使用Promise實現(xiàn)并發(fā)請求數(shù)限制
本文主要介紹了JavaScript使用Promise實現(xiàn)并發(fā)請求數(shù)限制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-04-04javascript 上下banner替換具體實現(xiàn)
這篇文章介紹了javascript 上下banner替換具體實現(xiàn),有需要的朋友可以參考一下2013-11-11一文詳解JavaScript中的replace()函數(shù)
replace方法的語法是stringObj.replace(rgExp, replaceText),其中stringObj是字符串(string),下面這篇文章主要給大家介紹了關(guān)于JavaScript中replace()函數(shù)的相關(guān)資料,需要的朋友可以參考下2023-01-01Javascript類型系統(tǒng)之undefined和null淺析
這篇文章主要介紹了Javascript類型系統(tǒng)之undefined和null的知識,通過本文還簡單給大家介紹了javascript中null和undefined的區(qū)別的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07Javascript insertAfter() 實現(xiàn)函數(shù)代碼
DOM沒有提供insertAfter()方法,我們可以自己擴展下。2011-10-10