## 1、 棧
>棧是一種 LIFO(Last-In-First-Out, 后進先出)的數據結構,也就是先進后出的理念,而棧中項插入(叫做堆入)和移除(叫做彈出),只發生在一個位置 --棧的頂部,我們可以把棧想象為一個開口向上的容器,如圖所示:

* 存入數據,棧的變化:
>最開始的時候棧中不含有任何數據,叫做空棧,此時棧頂就是棧底,然后數據從棧頂進入,棧頂和棧底分離,整個棧的當前容量變大;數據出棧時,數據從棧頂彈出,棧頂下移,整個棧的容量變小
* `push`和`pop`實現棧的行為:
>`push` 操作實現了在棧頂的堆入,返回改變后數組的長度;
>`pop`的操作實現了在棧底的彈出,返回移除那項的內容。
* 在Chrome瀏覽器控制臺輸出堆棧的效果如下圖所示:

## 2、隊列
>隊列是一種FIFO(First-In-First-Out, 先進先出)。隊列在列表的末端添加項,從列表的前端移除項,如下圖所示:

* `unshift`和`pop`實現棧的行為(用`shift`和`push`也可以):
>`unshift` 操作實現了在隊列的添加,返回改變后數組的長度;
* 在Chrome瀏覽器控制臺輸出隊列的效果如下圖所示:

## 3、數組操作api性能分析
* `push()`和`unshift()`性能分析
>`push()`操作是在數組的尾部添加的,不影響其他數據的位置變化,但是`unshift`是在數據的頭部添加的,每次的添加都會影響后面的數據忘后面移動一位,影響性能。
```
var arr = [ ];
var startTime = +new Date(); //+new Date()相當于new Date().valueOf(),返回當前時間的毫秒數
// push性能測試
for (var i = 0; i < 100000; i++) {
arr.push(i);
}
var endTime = +new Date();
console.log("調用push方法往數組中添加100000個元素耗時"+(endTime-startTime)+"毫秒");
startTime = +new Date();
arr = [ ];
// unshift性能測試
for (var i = 0; i < 100000; i++) {
arr.unshift(i);
}
endTime = +new Date();
console.log("調用unshift方法往數組中添加100000個元素耗時"+(endTime-startTime)+"毫秒");
```
瀏覽器輸出結果:

* `reverse()`性能分析
```
var arr = [ ], s = +new Date;
for (var i = 0; i < 100000; i++) {
arr.push(i);
}
console.log("調用reverse方法將數組里面的100000元素的順序反轉耗時:"+(+new Date - s)+"毫秒");
```
瀏覽器輸出的結果:

總結:在大數據的數組操作是,盡量在數據的尾部操作,如果需要操作數組頭部的內容,可以通過數組的`reverse()`方法進行反轉操作。
例題

- git-第一天
- Git-第二天
- git-第三天
- http-基礎
- HTTP構成和狀態碼
- 瀏覽器輸入URL,經歷的過程
- TCP/IP 詳解三次握手 四次揮手
- http-DNS系統
- http與https之間的區別
- HTTPS握手和HTTP握手
- HTTP小試牛刀
- Tcp初探
- TCP報文格式
- HTML5
- HTML基礎
- Mock
- css 選擇器
- css 動畫
- css 定位
- position/display/float/z-index第一課時
- 行內、塊、脫標 三種狀態下的元素如何實現、水平、垂直居中
- clientHeight/offsetHeight/scrollHeight
- js 數據類型
- 變量提升
- 堆棧關系