一、上下文执行栈
堆栈是一种支持后进先出(LIFO)的操作受限制的线性表,只允许在栈顶进行插入或删除操作。
创建一个数组来模拟堆栈。
push:在数组末尾添加元素,并返回新的数组长度;
pop:在数组末尾删除最后一个元素,并返回这个元素的值。
var arrStack = [];console.log("入栈");for (var i = 0; i < 5; i++) { var temp = i + 1; arrStack.push(temp);//入栈 console.log(arrStack);//当前数据栈}console.log('出栈,先进后出。');/* 出栈过程arrStack.length是变化的,每移除一个元素,arrStack.length就会减1,所以需要将其赋值给一个变量*/var len = arrStack.length;for (var i = 0; i < len; i++) { console.log(arrStack);//当前数据栈 arrStack.pop();//出栈,在栈顶删除}
二、消息队列
队列是一种支持先进先出FIFO的操作受限制的线性表,只允许在表的前端(队头)进行删除操作,在表的后端(队尾)进行插入操作。
创建一个数组来模拟队列。
shift:在数组开头删除第一个元素,并返回这个元素的值;
unshift:在数组开头添加一个或多个元素,并返回新的数组长度。
var arrQueue = [];console.log("入队");for (var i = 0; i < 5; i++) { var temp = i + 1; arrQueue.unshift(temp);//在队尾,也就是数组开头入队 console.log(arrQueue);//当前数据队}console.log('出队,先进先出。');/* 出队过程arrQueue.length是变化的,每移除一个元素,arrQueue.length就会减1,所以需要将其赋值给一个变量*/var len = arrQueue.length;for (var i = 0; i < len; i++) { console.log(arrQueue);//当前数据队 arrQueue.pop();//出队,在队头,也就是数组末尾删除}
三、push()和unshift()的性能测试
push()和unshift()都能给数组添加元素,push()在数组末尾添加元素,unshift()在数组开头添加元素。unshift()效率较低,因为每添加一个新元素,就要把现有元素向下挪一个位置。到底差异多大,看看下面的例子就知道了。
var arrTest = [];var startTime = +new Date(); //+new Date()相当于new Date().valueOf(),返回当前时间的毫秒数// push性能测试 for (var i = 0 ; i < 100000 ; i++) { arrTest.push(i); }var endTime = +new Date();console.log("调用push方法往数组中添加个元素耗时"+(endTime-startTime)+"毫秒"); startTime = +new Date(); arrTest = []; // unshift性能测试 for (var i = 0 ; i < 100000 ; i++) { arrTest.unshift(i); }endTime = +new Date();console.log("调用unshift方法往数组中添加个元素耗时"+(endTime-startTime)+"毫秒");
平时要慎用unshift(),尤其是对大型数组。
如果一定要实现unshift的效果,可以借助reverse,把经过push添加的数组元素反转,即可。reverse方法的性能很高,可以放心使用。