您好,登錄后才能下訂單哦!
值類型:也稱為原始數(shù)據(jù)或原始值(primitive value)。
這類值存儲在棧(stack)中,棧是內(nèi)存中一種特殊的數(shù)據(jù)結(jié)構(gòu),也稱為線性表,棧按照后進先出的原則存儲數(shù)據(jù),先進入的數(shù)據(jù)被壓入棧底,最后插入(push)的數(shù)據(jù)放在棧頂,需要讀取數(shù)據(jù)時從棧頂開始彈出(pop)數(shù)據(jù),即最后一個數(shù)據(jù)被第一個讀出來。因此說,值類型都是簡單的數(shù)據(jù)段。變量的位置和變量值的位置是重疊的,也就是說值類型的數(shù)據(jù)被存儲在變量被訪問的位置。
引用類型:這類值存儲在堆(heap)中,堆是內(nèi)存中的動態(tài)區(qū)域,相當(dāng)于自留空間,在程序運行期間會動態(tài)分配給代碼和堆棧。
堆中存儲的一般都是對象,然后通過一個編號傳遞給棧內(nèi)變量,這個編號就是所謂的引用指針(point),這樣變量和變量值之間是分離的,它們通過指針相聯(lián)系。當(dāng)讀寫數(shù)據(jù)時,計算機通過變量的指針找到堆中的數(shù)據(jù)塊,并進行操作。
今天遇到一個坑,具體的不多說,直接上代碼
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 } ]
在一個基友群里問,最后終于自己得出結(jié)論了——這是因為值類型和引用類型不同的原因。
在JavaScript里的值大概分為兩種,一種是值類型,一種是引用類型。
值類型:數(shù)值、布爾值、null、undefined
引用類型:對象、數(shù)組、函數(shù)
我們例子中的obj雖然每次打印出來都是不同的,但是因為是引用類型,arr也是引用類型,即使obj push到arr里面了,也只是push進去了一個內(nèi)存地址而已,所以最后obj變成3了,arr里面引用的obj也會全部變成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)都會是單獨的一個內(nèi)存地址,這樣最后的obj即使變成了3,前面的obj也不會被影響到,因為他們的內(nèi)存地址根部不同。
以上所述是小編給大家介紹的JavaScript 值類型和引用類型的初次研究(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對億速云網(wǎng)站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。