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