您好,登錄后才能下訂單哦!
這篇文章主要講解了“JS引用數(shù)據(jù)類型的區(qū)別有什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JS引用數(shù)據(jù)類型的區(qū)別有什么”吧!
stack為自動分配的內(nèi)存空間,它由系統(tǒng)自動釋放;而heap則是動態(tài)分配的內(nèi)存,大小也不一定會自動釋放
JS分兩種數(shù)據(jù)類型:
基本數(shù)據(jù)類型:Number、String、Boolean、Null、Undefined、Symbol,這些類型可以直接操作保存在變量中的實際值。
引用數(shù)據(jù)類型:Object
基本數(shù)據(jù)類型是指存放在棧中的簡單數(shù)據(jù)段,數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配,它們是直接按值存放的,所以可以直接按值訪問
vara=10;
varb=a;
b=20;
console.log;//10值
console.log;//20值
引用類型是存放在堆內(nèi)存中的對象,變量其實是保存的在棧內(nèi)存中的一個指針,這個指針指向堆內(nèi)存。
引用類型數(shù)據(jù)在棧內(nèi)存中保存的實際上是對象在堆內(nèi)存中的引用地址。通過這個引用地址可以快速查找到保存中堆內(nèi)存中的對象
varobj1=newObject();varobj2=obj1;obj2.name="我有名字了";console.log;//我有名字了
說明這兩個引用數(shù)據(jù)類型指向了同一個堆內(nèi)存對象。obj1賦值給obj2,實際上這個堆內(nèi)存對象在棧內(nèi)存的引用地址復制了一份給了obj2,但是實際上他們共同指向了同一個堆內(nèi)存對象,所以修改obj2其實就是修改那個對象,所以通過obj1訪問也能訪問的到。
vara=;
varb=a;//傳址,對象中傳給變量的數(shù)據(jù)是引用類型的,會存儲在堆中;
varc=a;//傳值,把對象中的屬性/數(shù)組中的數(shù)組項賦值給變量,這時變量C是基本數(shù)據(jù)類型,存儲在棧內(nèi)存中;改變棧中的數(shù)據(jù)不會影響堆中的數(shù)據(jù)
alert;//1,2,3,4,5
alert;//1
//改變數(shù)值
b=6;
c=7;
alert;//6
alert;//1
從上面我們可以得知,當我改變b中的數(shù)據(jù)時,a中數(shù)據(jù)也發(fā)生了變化;但是當我改變c的數(shù)據(jù)值時,a卻沒有發(fā)生改變。
這就是傳值與傳址的區(qū)別。因為a是數(shù)組,屬于引用類型,所以它賦予給b的時候傳的是棧中的地址,而不是堆內(nèi)存中的對象。而c僅僅是從a堆內(nèi)存中獲取的一個數(shù)據(jù)值,并保存在棧中。所以b修改的時候,會根據(jù)地址回到a堆中修改,c則直接在棧中修改,并且不能指向a堆內(nèi)存中。
感謝各位的閱讀,以上就是“JS引用數(shù)據(jù)類型的區(qū)別有什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對JS引用數(shù)據(jù)類型的區(qū)別有什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。