JavaScript 值類型和引用類型的初次研究(推薦)
值類型:也稱為原始數(shù)據(jù)或原始值(primitive value)。
這類值存儲(chǔ)在棧(stack)中,棧是內(nèi)存中一種特殊的數(shù)據(jù)結(jié)構(gòu),也稱為線性表,棧按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后插入(push)的數(shù)據(jù)放在棧頂,需要讀取數(shù)據(jù)時(shí)從棧頂開始彈出(pop)數(shù)據(jù),即最后一個(gè)數(shù)據(jù)被第一個(gè)讀出來。因此說,值類型都是簡單的數(shù)據(jù)段。變量的位置和變量值的位置是重疊的,也就是說值類型的數(shù)據(jù)被存儲(chǔ)在變量被訪問的位置。
引用類型:這類值存儲(chǔ)在堆(heap)中,堆是內(nèi)存中的動(dòng)態(tài)區(qū)域,相當(dāng)于自留空間,在程序運(yùn)行期間會(huì)動(dòng)態(tài)分配給代碼和堆棧。
堆中存儲(chǔ)的一般都是對象,然后通過一個(gè)編號(hào)傳遞給棧內(nèi)變量,這個(gè)編號(hào)就是所謂的引用指針(point),這樣變量和變量值之間是分離的,它們通過指針相聯(lián)系。當(dāng)讀寫數(shù)據(jù)時(shí),計(jì)算機(jī)通過變量的指針找到堆中的數(shù)據(jù)塊,并進(jìn)行操作。
今天遇到一個(gè)坑,具體的不多說,直接上代碼
var a = [ [],[],[1,2,3] ] var b = ['顏色','大小','尺寸'] var arr = [] for(let i = 0; i < a.length; i ++){ let obj = {} for(let j = 0; j < a[i].length; j ++){ obj[b[i]] = a[i][j] arr.push(obj) console.log(arr) console.log(obj) } } console.log(arr)
我預(yù)期的 arr 的結(jié)果應(yīng)該是
[ { '尺寸': 1 }, { '尺寸': 2 }, { '尺寸': 3 } ]
最后arr的結(jié)果居然是這樣的
[ { '尺寸': 3 }, { '尺寸': 3 }, { '尺寸': 3 } ]
在一個(gè)基友群里問,最后終于自己得出結(jié)論了——這是因?yàn)橹殿愋秃鸵妙愋筒煌脑颉?/p>
在JavaScript里的值大概分為兩種,一種是值類型,一種是引用類型。
值類型:數(shù)值、布爾值、null、undefined
引用類型:對象、數(shù)組、函數(shù)
我們例子中的obj雖然每次打印出來都是不同的,但是因?yàn)槭且妙愋停琣rr也是引用類型,即使obj push到arr里面了,也只是push進(jìn)去了一個(gè)內(nèi)存地址而已,所以最后obj變成3了,arr里面引用的obj也會(huì)全部變成3。很神奇吧,最后解決的辦法也很簡單
var a = [ [],[],[1,2,3] ] var b = ['顏色','大小','尺寸'] var arr = [] for(let i = 0; i < a.length; i ++){ for(let j = 0; j < a[i].length; j ++){ let obj = {} obj[b[i]] = a[i][j] arr.push(obj) } } console.log(arr)
只要把obj的聲明放在最內(nèi)層的循環(huán)里面,每次循環(huán)都會(huì)是單獨(dú)的一個(gè)內(nèi)存地址,這樣最后的obj即使變成了3,前面的obj也不會(huì)被影響到,因?yàn)樗麄兊膬?nèi)存地址根部不同。
以上所述是小編給大家介紹的JavaScript 值類型和引用類型的初次研究(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
js實(shí)現(xiàn)正則匹配中文標(biāo)點(diǎn)符號(hào)的方法
這篇文章主要介紹了js實(shí)現(xiàn)正則匹配中文標(biāo)點(diǎn)符號(hào)的方法,涉及JavaScript正則匹配與判定的簡單使用技巧,需要的朋友可以參考下2015-12-12使用 JavaScript 創(chuàng)建并下載文件(模擬點(diǎn)擊)
本文將介紹如何使用 JavaScript 創(chuàng)建文件,并自動(dòng)/手動(dòng)將文件下載,這在導(dǎo)出原始數(shù)據(jù)時(shí)會(huì)比較方便2019-10-10JS實(shí)現(xiàn)前端動(dòng)態(tài)分頁碼代碼實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)前端動(dòng)態(tài)分頁碼代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06javascript 面向?qū)ο蠹夹g(shù)基礎(chǔ)教程
看了很多介紹javascript面向?qū)ο蠹夹g(shù)的文章,很暈.為什么?不是因?yàn)閷懙貌缓?而是因?yàn)樘願(yuàn)W.2009-12-12獲取3個(gè)數(shù)組不重復(fù)的值的具體實(shí)現(xiàn)
先用concat拼接數(shù)組 ,再使用一個(gè)對象、一個(gè)新數(shù)組(用于存放不重復(fù)的數(shù)組)具體實(shí)現(xiàn)如下,感興趣的朋友可以參考2013-12-12kindeditor編輯器點(diǎn)中圖片滾動(dòng)條往上頂?shù)腷ug
這篇文章主要介紹了kindeditor編輯器點(diǎn)中圖片滾動(dòng)條往上頂?shù)腷ug的相關(guān)資料,需要的朋友可以參考下2015-07-07