![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)相差好多好多倍拟逮,可見(jià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)+"毫秒");
可見(jiàn)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ò)的選擇。