a.js的堆、栈与队列,看完就弄懂了

堆的定义


堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。

堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。

以下一张图清晰了解堆:

image-one

通过image-one我们可以看出把a赋值给b,当b对象改变属性后,a也随之发生改变,这是因为a和b引用的是同一个堆对象,从一个向另一个变量复制引用类型的值,复制的其实是指针指针是存放在栈(stack)里面,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。

引用数据类型(Object、Array、Function)存储在堆中,堆是运行时申请的动态内存,顺序随意。

项目实际问题

如果项目中需要赋值两个对象且只需要改变新对象的地址以及值,那么我们可以使用JSON.parse(JSON.stringify(value))进行深拷贝赋值。

栈的定义


栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。

栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等

image-two

创建好栈后,栈一般包含以下方法:

push(): 添加新元素到栈顶

pop(): 移除栈顶的元素,同时返回被移除的元素

peek(): 返回栈顶的元素,不对栈做任何修改

isEmpty(): 如果栈里没有任何元素就返回true,否则返回false

clear(): 移除栈里的所有元素

size(): 返回栈里的元素个数


栈的实现


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

自制入栈图

执行pop()方法后进行出栈,出栈如下图流程:

自制出栈图

出栈也是和入栈相同,都是从栈顶开始出栈,保证栈的后入先出原则

队列


队列与栈一样,也是一种线性表,不同的是,队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。从一端放入元素的操作称为入队,取出元素为出队。

队列在尾部添加新元素,并从顶部移除元素。最新添加的元素必须排在队列的末尾。

队列的方法和栈基本相同,JavaScript中事件轮询(Event Loop)的执行机制,就是采用队列的存取方式,因事件轮询是js比较重要的一个只是点,等下次文章会总结事件轮询。


以上就是对堆、栈、队列的个人总结,理解了js的底层数据原理等等后才能更好的使用vue等框架,有些面试官也会问这几个概念的问题,了解一下对自己也是有好处的。

你可能感兴趣的:(a.js的堆、栈与队列,看完就弄懂了)