堆的定義
堆是一種比較特殊的數(shù)據(jù)結(jié)構(gòu)奕枝,可以被看做一棵樹的數(shù)組對(duì)象棺榔,具有以下的性質(zhì): 堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值; 堆總是一棵完全二叉樹隘道。
堆(heap):一般由程序員分配釋放症歇,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)釋放谭梗。
以下一張圖清晰了解堆:
通過image-one我們可以看出把a(bǔ)賦值給b忘晤,當(dāng)b對(duì)象改變屬性后,a也隨之發(fā)生改變默辨,這是因?yàn)閍和b引用的是同一個(gè)堆對(duì)象德频,從一個(gè)向另一個(gè)變量復(fù)制引用類型的值,復(fù)制的其實(shí)是指針缩幸,指針是存放在棧(stack)里面壹置,因此兩個(gè)變量最終指向同一個(gè)對(duì)象。即復(fù)制的是棧中的地址而不是堆中的對(duì)象表谊。
引用數(shù)據(jù)類型(Object钞护、Array、Function)存儲(chǔ)在堆中爆办,堆是運(yùn)行時(shí)申請(qǐng)的動(dòng)態(tài)內(nèi)存难咕,順序隨意。
項(xiàng)目實(shí)際問題
如果項(xiàng)目中需要賦值兩個(gè)對(duì)象且只需要改變新對(duì)象的地址以及值,那么我們可以使用JSON.parse(JSON.stringify(value))進(jìn)行深拷貝賦值余佃。
棧的定義
棧是一種特殊的線性表暮刃,僅能在線性表的一端操作,棧頂允許操作爆土,棧底不允許操作椭懊。 棧的特點(diǎn)是:先進(jìn)后出,或者說是后進(jìn)先出步势,從棧頂放入元素的操作叫入棧氧猬,取出元素叫出棧。
棧(stack):由編譯器自動(dòng)分配釋放坏瘩,存放函數(shù)的參數(shù)值盅抚,局部變量等
創(chuàng)建好棧后,棧一般包含以下方法:
push(): 添加新元素到棧頂
pop(): 移除棧頂?shù)脑鼐蠓瑫r(shí)返回被移除的元素
peek(): 返回棧頂?shù)脑赝粚?duì)棧做任何修改
isEmpty(): 如果棧里沒有任何元素就返回true,否則返回false
clear(): 移除棧里的所有元素
size(): 返回棧里的元素個(gè)數(shù)
棧的實(shí)現(xiàn)
function Stack(){
let dataStore= []
this.push =function(element){? ? dataStore.push(element)? }?
this.pop =function(){return dataStore.pop()? }
this.peek =function(){return dataStore[dataStore.length -1]? }
this.isEmpty =function(){return dataStore.length ==0}
this.size =function(){return dataStore.length? }
this.clear =function(){? ? dataStore = [] }
this.print =function(){console.log(dataStore.toString())? }
}
棧的使用
let stack =new Stack()
stack.push('a')
stack.push('b')
stack.push('c')
console.log(stack.peek()) // 3
console.log(stack.size()) // 3
執(zhí)行pop()方法后進(jìn)行出棧破讨,出棧如下圖流程:
出棧也是和入棧相同丛晦,都是從棧頂開始出棧奕纫,保證棧的后入先出原則
隊(duì)列
隊(duì)列與棧一樣提陶,也是一種線性表,不同的是匹层,隊(duì)列可以在一端添加元素隙笆,在另一端取出元素,也就是:先進(jìn)先出升筏。從一端放入元素的操作稱為入隊(duì)撑柔,取出元素為出隊(duì)。
隊(duì)列在尾部添加新元素您访,并從頂部移除元素铅忿。最新添加的元素必須排在隊(duì)列的末尾。
隊(duì)列的方法和椓橥簦基本相同檀训,JavaScript中事件輪詢(Event Loop)的執(zhí)行機(jī)制,就是采用隊(duì)列的存取方式享言,因事件輪詢是js比較重要的一個(gè)只是點(diǎn)峻凫,等下次文章會(huì)總結(jié)事件輪詢。
以上就是對(duì)堆览露、棧荧琼、隊(duì)列的個(gè)人總結(jié),理解了js的底層數(shù)據(jù)原理等等后才能更好的使用vue等框架,有些面試官也會(huì)問這幾個(gè)概念的問題命锄,了解一下對(duì)自己也是有好處的堰乔。