本篇內(nèi)容介紹了“JavaScript數(shù)組中的深復(fù)制與淺復(fù)制是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)公司是一家以網(wǎng)絡(luò)技術(shù)公司,為中小企業(yè)提供網(wǎng)站維護、網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、網(wǎng)站備案、服務(wù)器租用、主機域名、軟件開發(fā)、小程序定制開發(fā)等企業(yè)互聯(lián)網(wǎng)相關(guān)業(yè)務(wù),是一家有著豐富的互聯(lián)網(wǎng)運營推廣經(jīng)驗的科技公司,有著多年的網(wǎng)站建站經(jīng)驗,致力于幫助中小企業(yè)在互聯(lián)網(wǎng)讓打出自已的品牌和口碑,讓企業(yè)在互聯(lián)網(wǎng)上打開一個面向全國乃至全球的業(yè)務(wù)窗口:建站歡迎聯(lián)系:18982081108
介紹數(shù)組的深復(fù)制與淺復(fù)制,首先給大家回顧回顧數(shù)據(jù)類型
1、基本數(shù)據(jù)類型::number
string
boolean
null
undefined
存儲方式: 基本數(shù)據(jù)類型存儲在棧內(nèi)存中
變量存儲的就是值
2、引用數(shù)據(jù)類型:function 數(shù)組 對象(下篇介紹)
存儲方式: 引用數(shù)據(jù)類型存儲在堆內(nèi)存中
變量存儲的是地址?!鞠嚓P(guān)推薦:javascript學(xué)習(xí)教程】
至于存儲方式我們來分析分析:
先給大家介紹介紹棧內(nèi)存與堆內(nèi)存,作為了解:
棧內(nèi)存:引擎執(zhí)行代碼時工作的內(nèi)存空間,除了引擎,也用來保存基本值和引用類型值的地址。
堆內(nèi)存:用來保存一組無序且唯一的引用類型值,可以使用棧中的鍵名來取得。
我們再來看:
var a = 2; var b = a; b++;//3 console.log(a); //2
分析分析,將a的值賦值給b,接著改變b的值,a的值沒有受到影響。但是引用數(shù)據(jù)類型,那就不是這樣了,賦值的是地址。
var arr = [1,2,3] ; var arr2 = arr ; arr2.push(4) ; console.log(arr); // arr發(fā)生了改變
分析分析,arr復(fù)制的是地址,何為地址,可以比作成一個房間,arr和arr2都是指向的這個房間,改變這個房間的結(jié)構(gòu),arr和arr2都會受到影響。如下圖
深復(fù)制與淺復(fù)制
數(shù)組的淺復(fù)制:只復(fù)制了地址 (共享地址)
數(shù)組的深復(fù)制:復(fù)制值
遍歷(把原數(shù)組中的值存入新的數(shù)組) var arr2 = [] ;
slice() 截取數(shù)組中的所有值,得到的是一個新數(shù)組。
就是要在堆內(nèi)存中開辟一個新的空間。
數(shù)組的淺復(fù)制:
只復(fù)制了地址 (共享地址)
var arr = [1,2,3,4,5] ; // 數(shù)組的淺復(fù)制 --- 只是復(fù)制了地址 var arr2 = arr ; //改變其中一個數(shù)組,兩個數(shù)組都會改變,
還是很簡單理解淺復(fù)制的。
數(shù)組的深復(fù)制:
復(fù)制數(shù)組中的值
1、定義一個新的空數(shù)組,遍歷原數(shù)組并賦值給新數(shù)組
var arr = [1, 2, 3, 4, 5] var arr3 = []; arr.forEach(function(v) { arr3.push(v) }) console.log(arr3); arr3.push('a'); console.log(arr, arr3);//arr[1,2,3,4,5],arr3[1,2,3,4,5,'a']
改變新數(shù)組中的值,原數(shù)組不會改變
2、slice() 截取數(shù)組中的所有值,得到的是一個新數(shù)組
var arr3 = arr.slice() ; console.log(arr3); arr3.push('a') ; console.log(arr3);//[1,2,3,4,5,'a'] console.log(arr);//[1,2,3,4,5]
改變新數(shù)組中的值,原數(shù)組不會改變
在這里提一嘴:
基本數(shù)據(jù)類型傳遞是值 ,引用數(shù)據(jù)類型傳遞的是地址(形參和實參共享地址)
難點難點,多維數(shù)組的深復(fù)制,以上提到的都是一維數(shù)組的深復(fù)制和淺復(fù)制
二維數(shù)組:二維數(shù)組本質(zhì)上是以數(shù)組作為數(shù)組元素的數(shù)組,即“數(shù)組的數(shù)組”,例如:arr=[[1,2,3],[1,2],[1,2,3,4]]
分析以下代碼,為二維數(shù)組的遍歷,變量i,j代表的就是,下標為i元素(也就是數(shù)組)中的第 j+1個元素。
var arr = [ [1, 2, 3], [4, 5, 6], [2, 3, 4] ] for (var i in arr) { for (var j in arr[i]) { console.log(arr[i][j]); } }
多維數(shù)組:三維及其以上的數(shù)組
多維數(shù)組的深復(fù)制
多維數(shù)組的深復(fù)制可不像一維數(shù)組那樣好判斷,因為你無法判斷數(shù)組中的元素是否又是數(shù)組,數(shù)組中有數(shù)組,無止境,哈哈,所以就需要用到前面提到的遞歸。
用到的方法:Array.isArray(arr[i])
判斷數(shù)組,返回布爾值。
思路:判斷多維數(shù)組的元素是否是數(shù)組,是的話,繼續(xù)遍歷這個數(shù)組,在判斷,如果不是,就可以用一維數(shù)組的判斷方式來實現(xiàn)深復(fù)制。
“JavaScript數(shù)組中的深復(fù)制與淺復(fù)制是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!