摘要:最近由于做的項目需求牽扯到了大量的數(shù)據(jù)處理,于是就想了解一下中的數(shù)據(jù)類型,于是就百度了一下找到了些干貨,在這里精簡下做個筆記,以方便日后需要的時候查看這里先說兩個概念堆棧堆是堆內(nèi)存的簡稱。
最近由于做的項目需求牽扯到了大量的數(shù)據(jù)處理,于是就想了解一下javascript中的數(shù)據(jù)類型,于是就百度了一下找到了些干貨,在這里精簡下做個筆記,以方便日后需要的時候查看:
這里先說兩個概念:1、堆(heap)2、棧(stack)
堆 是堆內(nèi)存的簡稱。
棧 是棧內(nèi)存的簡稱。
說到堆棧,我們講的就是內(nèi)存的使用和分配了,沒有寄存器的事,也沒有硬盤的事。
各種語言在處理堆棧的原理上都大同小異。堆是動態(tài)分配內(nèi)存,內(nèi)存大小不一,也不會自動釋放。棧是自動分配相對固定大小的內(nèi)存空間,并由系統(tǒng)自動釋放。
javascript的基本類型就5種:Undefined、Null、Boolean、Number和String,它們都是直接按值存儲在棧中的,每種類型的數(shù)據(jù)占用的內(nèi)存空間的大小是確定的,并由系統(tǒng)自動分配和自動釋放。這樣帶來的好處就是,內(nèi)存可以及時得到回收,相對于堆來說,更加容易管理內(nèi)存空間。
javascript中其他類型的數(shù)據(jù)被稱為引用類型的數(shù)據(jù) : 如對象(Object)、數(shù)組(Array)、函數(shù)(Function) …,它們是通過拷貝和new出來的,這樣的數(shù)據(jù)存儲于堆中。其實,說存儲于堆中,也不太準(zhǔn)確,因為,引用類型的數(shù)據(jù)的地址指針是存儲于棧中的,當(dāng)我們想要訪問引用類型的值的時候,需要先從棧中獲得對象的地址指針,然后,在通過地址指針找到堆中的所需要的數(shù)據(jù)。
說來也是形象,棧,線性結(jié)構(gòu),后進先出,便于管理。堆,一個混沌,雜亂無章,方便存儲和開辟內(nèi)存空間
傳值與傳址
var arr1 = [1,2,5,8]; var arr2 = arr1 ; var str1 = arr1[2]; console.log(arr2);//1,2,5,8 console.log(str1);//5 arr2[4] = 99; str1 = 6; console.log(arr1);//1,2,5,8,99 console.log(arr1[2]);//5
上方例子得知,當(dāng)我改變arr2中的數(shù)據(jù)時,arr1中數(shù)據(jù)也發(fā)生了變化,當(dāng)改變str1的數(shù)據(jù)值時,arr1卻沒有發(fā)生改變。為什么?這就是傳值與傳址的區(qū)別。
因為arr1是數(shù)組,屬于引用類型,所以它賦予給arr2的時候傳的是棧中的地址(相當(dāng)于新建了一個不同名“指針”),而不是堆內(nèi)存中的對象的值。str1得到的是一個基本類型的賦值,因此,str1僅僅是從arr1堆內(nèi)存中獲取了一個數(shù)值,并直接保存在棧中。arr1、arr2都指向同一塊堆內(nèi)存,arr2修改的堆內(nèi)存的時候,也就會影響到arr1,str1是直接在棧中修改,并且不能影響到arr1堆內(nèi)存中的數(shù)據(jù)。
淺拷貝和深拷貝
上邊說到的賦值方式就是淺拷貝,那么什么叫作深拷貝呢?就是要將arr1的每個基本類型的數(shù)據(jù)都遍歷一遍,依次的賦值給arr2的對應(yīng)字段。避免產(chǎn)生因為地址引用帶來的問題。
var arr1 = [1,2,5,8]; var arr2 = []; for(var i=0;ijavascript面向?qū)ο蟮恼Z言本身在處理對象和非對象上就進行了劃分,從數(shù)據(jù)結(jié)構(gòu)的角度來講,對象就是棧的指針和堆中的數(shù)值。
本文內(nèi)容借鑒自
鏈接:https://www.jianshu.com/p/5e0...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/96493.html
摘要:基本數(shù)據(jù)類型的值保存在棧內(nèi)存中的簡單數(shù)據(jù)段,按值訪問。文字常量區(qū)存儲常量字符串保存在棧中保存在棧中,保存在常量區(qū)程序代碼區(qū)存儲程序的二進制代碼關(guān)于數(shù)字類型根據(jù)關(guān)于的描述可知,的數(shù)字類型只有一種,使用標(biāo)準(zhǔn)中的雙精度浮點數(shù)來存儲,長度為位。 數(shù)據(jù)類型 基本數(shù)據(jù)類型:String,Boolean,Number,undefined,null,Symbol(ES6)引用數(shù)據(jù)類型:Object,F(xiàn)...
摘要:棧區(qū)由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。屬性返回對創(chuàng)建此對象的構(gòu)造函數(shù)的引用。所有的和都是宿主對象參考高級程序設(shè)計堆和棧的概念和區(qū)別全面解析中的數(shù)據(jù)類型與類型轉(zhuǎn)換 數(shù)據(jù)類型 數(shù)據(jù)類型劃分 javascript中定義了6中基本數(shù)據(jù)類型(原始值類型),和一種復(fù)雜數(shù)據(jù)類型(引用類型),所謂復(fù)雜類型,其本質(zhì)是由無序的名值對(key:val...
摘要:因此,所有在方法中定義的變量都是放在棧內(nèi)存中的當(dāng)我們在程序中創(chuàng)建一個對象時,這個對象將被保存到運行時數(shù)據(jù)區(qū)中,以便反復(fù)利用因為對象的創(chuàng)建成本通常較大,這個運行時數(shù)據(jù)區(qū)就是堆內(nèi)存。 上一篇:《javascript高級程序設(shè)計》筆記:繼承近幾篇博客都會圍繞著圖中的知識點展開 showImg(https://segmentfault.com/img/bVY0C4?w=1330&h=618);...
摘要:堆內(nèi)存主要作用是存放運行時創(chuàng)建的對象。堆內(nèi)存用來存放由創(chuàng)建的對象和數(shù)組,在堆中分配的內(nèi)存,由虛擬機的自動垃圾回收器來管理。這也是比較占內(nèi)存的原因,實際上,棧中的變量指向堆內(nèi)存中的變量,這就是中的指針 堆:(對象) 引用類型的變量,其內(nèi)存分配在堆上或者常量池(字符串常量、基本數(shù)據(jù)類型常量),需要通過new等方式來創(chuàng)建。 堆內(nèi)存主要作用是存放運行時創(chuàng)建(new)的對象。(主要用于存放對象,...
閱讀 1872·2023-04-25 23:43
閱讀 1004·2021-11-24 09:39
閱讀 782·2021-11-22 15:25
閱讀 1782·2021-11-22 12:08
閱讀 1165·2021-11-18 10:07
閱讀 2133·2021-09-23 11:22
閱讀 3432·2021-09-22 15:23
閱讀 2686·2021-09-13 10:32