堆的定义
堆是一种比较特殊的数据结构,可以被看做一棵树的数组对象,具有以下的性质: 堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树。
堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。
以下一张图清晰了解堆:
通过image-one我们可以看出把a赋值给b,当b对象改变属性后,a也随之发生改变,这是因为a和b引用的是同一个堆对象,从一个向另一个变量复制引用类型的值,复制的其实是指针,指针是存放在栈(stack)里面,因此两个变量最终指向同一个对象。即复制的是栈中的地址而不是堆中的对象。
引用数据类型(Object、Array、Function)存储在堆中,堆是运行时申请的动态内存,顺序随意。
项目实际问题
如果项目中需要赋值两个对象且只需要改变新对象的地址以及值,那么我们可以使用JSON.parse(JSON.stringify(value))进行深拷贝赋值。
栈的定义
栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。 栈的特点是:先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈。
栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等
创建好栈后,栈一般包含以下方法:
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等框架,有些面试官也会问这几个概念的问题,了解一下对自己也是有好处的。