![Uploading 9247.tmp_651084.png . . .]
數(shù)組的棧
棧是一種LIFO(Last-In-First-Out,后進(jìn)先出)的數(shù)據(jù)結(jié)構(gòu),也就是最新添加的項(xiàng)最早被移除。
push方法
push從數(shù)組的后面推入數(shù)組的項(xiàng),并返回?cái)?shù)組的長(zhǎng)度。
pop方法
pop刪除數(shù)組的最后一項(xiàng),并返回改項(xiàng)的值。
var colors=new Array;
var count=colors.push("green","blue");
console.log(count);//2
var a=['a','b','c'];
var item=a.pop();
console.log(item);//c
數(shù)組列隊(duì)
列隊(duì)數(shù)據(jù)的訪問(wèn)規(guī)則是先進(jìn)先出,F(xiàn)IFO(first in first out)的行為。列隊(duì)在列隊(duì)的末端添加項(xiàng),在列隊(duì)的前端移除項(xiàng)。ECMAscript定義shift()方法移除前端的第一項(xiàng),并返回改項(xiàng)。
shift方法
shift方法移除數(shù)組的第一項(xiàng),并返回該項(xiàng)。
var a=['a','b','c'];
var item=a.shift();
console.log(item);//a
unshift方法
相反的,unshift方法在數(shù)組的前端添加任意項(xiàng),并返回?cái)?shù)組的長(zhǎng)度。
var a=['a','b','c'];
var item=a.unshift('1','1');
console.log(item);//5
push 和 unshift 的性能測(cè)試
//push 和unshift的性能測(cè)試
//=+new Date(),相當(dāng)于Date().valueOf();
var arr=[];
var startTime=new Date().valueOf();
for(var i=0;i<100000;i++){
arr.push(i);
}
var endTime=new Date().valueOf();
console.log("調(diào)用push方法往數(shù)組中添加100000個(gè)元素耗時(shí)"+(endTime-startTime)+"毫秒")
startTime=+new Date();
arr=[];
for(var i=0;i<100000;i++){
arr.unshift(i);
}
endTime=+new Date();
console.log("調(diào)用unshift方法往數(shù)組中添加100000個(gè)元素耗時(shí)"+(endTime-startTime)+"毫秒")
查看結(jié)果發(fā)現(xiàn)相差好多好多倍,可見中間的性能差異。所以少用unshift。如果一定要用unshift,可以借助Array的reverse方法,先將數(shù)據(jù)push添加到數(shù)組,再執(zhí)行一次reverse,就達(dá)到unshift的效果了。
//reverse性能測(cè)試
var d=[],s=+new Date;
for (var i = 0; i <100000; i++) {
d.push(i)
};
d.reverse()
console.log("調(diào)用reverse方法將數(shù)組里面的100000元素的順序反轉(zhuǎn)耗時(shí):"+(+new Date - s)+"毫秒");
可見reverse方法性能不錯(cuò),可以代替unshift使用。
同樣我們可以對(duì)pop,和shift方法進(jìn)行測(cè)試。
//pop 刪除時(shí)間
var pop=[];
for(var i=0;i<100000;i++){
pop.push(i);
}
var e=+new Date;
console.log(pop)
for (var i = 0; i <100000; i++) {
pop.pop();
};
console.log(pop);
console.log("pop刪除數(shù)組耗時(shí):"+(+new Date - e)+"毫秒");
//shift 刪除時(shí)間
var shift=[];
for(var i=0;i<100000;i++){
shift.push(i);
}
var f=+new Date;
console.log(shift)
for (var i = 0; i <100000; i++) {
shift.shift();
};
console.log(shift);
console.log("shift刪除數(shù)組耗時(shí):"+(+new Date - f)+"毫秒");
最后發(fā)現(xiàn)谷歌瀏覽器shift有著良好的性能表現(xiàn),火狐相應(yīng)時(shí)間卻非常慢。
兩者有著巨大的差別。或許兩者有著不同的實(shí)現(xiàn)方式。
結(jié)
1.push推入數(shù)組,放回?cái)?shù)組長(zhǎng)度
2.pop刪除數(shù)組最后一位,返回改項(xiàng)的值
3.shift 刪除數(shù)組的第一項(xiàng),并返回改項(xiàng)的值
4.unshift 從數(shù)組的第一項(xiàng)推入,并返回?cái)?shù)組的長(zhǎng)度
5.push和unshift有著較大的性能差別,采用reverse方式代替unshift方式是不錯(cuò)的選擇。