
## 1.forEach
自從JavaScript5起,我們開始可以使用內置的forEach方法:
```js
myArray.forEach(function (value) {
console.log(value);
});
```
寫法簡單了許多,但也有**短處:你不能中斷循環(使用break語句或使用return語句。**
## 2.for–in
for-in循環實際是為循環”enumerable“對象而設計的:
```js
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// 輸出:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
```
你也可以用它來循環一個數組:
```js
for (var index in myArray) { // 不推薦這樣
console.log(myArray[index]);
}
```
不推薦用for-in來循環一個數組,因為,不像對象,數組的index跟普通的對象屬性不一樣,是重要的數值序列指標。
**總之,for–in是用來循環帶有字符串key的對象的方法。**
**for-in 循環的每次迭代都會產生更多開銷,因此要比其他循環類型慢**,一般速度為其他類型循環的 1/7。因此,除非明確需要迭代一個屬性數量未知的對象,否則應避免使用 for-in 循環。如果需要遍歷一個數量有限的已知屬性列表,使用其他循環會更快。
## 3.for-of循環
### 3.1 為什么要引進 for-of?
要回答這個問題,我們先來看看ES6之前的 3 種 for 循環有什么缺陷:
- forEach 不能 break 和 return;
- for-in 缺點更加明顯,它不僅遍歷數組中的元素,還會遍歷自定義的屬性,甚至原型鏈上的屬性都被訪問到。而且,遍歷數組元素的順序可能是隨機的。
所以,鑒于以上種種缺陷,我們需要改進原先的 for 循環。但 ES6 不會破壞你已經寫好的 JS 代碼。目前,成千上萬的 Web 網站依賴 for-in 循環,其中一些網站甚至將其用于數組遍歷。如果想通過修正 for-in 循環增加數組遍歷支持會讓這一切變得更加混亂,因此,標準委員會在 ES6 中增加了一種新的循環語法來解決目前的問題,即 for-of 。
```js
for (var value of myArray) {
console.log(value);
}
```
for-of的語法看起來跟for-in很相似,但它的功能卻豐富的多,它能循環很多東西。
### 3.2 那 for-of 到底可以干什么呢?
- 跟 forEach 相比,可以正確響應 break, continue, return。
- for-of 循環不僅支持數組,還支持大多數類數組對象,例如 DOM nodelist 對象。
- for-of 循環也支持字符串遍歷,它將字符串視為一系列 Unicode 字符來進行遍歷。
- for-of 也支持 Map 和 Set (兩者均為 ES6 中新增的類型)對象遍歷。
但需要注意的是,**for-of循環不支持普通對象**,但如果你想迭代一個對象的屬性,你可以用 for-in 循環(這也是它的本職工作)。
最后要說的是,ES6 引進的另一個方式也能實現遍歷數組的值,那就是 **Iterator**。
**循環一個數組(Array)**
```js
let iterable = [10, 20, 30];
for (let value of iterable) {
console.log(value);
}
// 10
// 20
// 30
```
我們可以使用const來替代let,這樣它就變成了在循環里的不可修改的靜態變量。
```js
let iterable = [10, 20, 30];
for (const value of iterable) {
console.log(value);
}
// 10
// 20
// 30
```
**循環一個字符串**
```js
let iterable = "boo";
for (let value of iterable) {
console.log(value);
}
// "b"
// "o"
// "o"
```
**循環一個類型化的數組**
```js
let iterable = new Uint8Array([0x00, 0xff]);
for (let value of iterable) {
console.log(value);
}
// 0
// 255
```
**循環一個Map**
```js
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let [key, value] of iterable) {
console.log(value);
}
// 1
// 2
// 3
for (let entry of iterable) {
console.log(entry);
}
// [a, 1]
// [b, 2]
// [c, 3]
```
**循環一個 Set**
```js
let iterable = new Set([1, 1, 2, 2, 3, 3]);
for (let value of iterable) {
console.log(value);
}
// 1
// 2
// 3
```
**循環一個 DOM collection**
循環一個DOM collections,比如NodeList,之前我們討論過如何循環一個NodeList,現在方便了,可以直接使用for-of循環:
```js
// Note: This will only work in platforms that have
// implemented NodeList.prototype[Symbol.iterator]
let articleParagraphs = document.querySelectorAll("article > p");
for (let paragraph of articleParagraphs) {
paragraph.classList.add("read");
}
```
**循環一個擁有enumerable屬性的對象**
for–of循環并不能直接使用在普通的對象上,但如果我們按對象所擁有的屬性進行循環,可使用內置的Object.keys()方法:
```js
for (var key of Object.keys(someObject)) {
console.log(key + ": " + someObject[key]);
}
```
**循環一個生成器(generators)**
```js
function* fibonacci() { // a generator function
let [prev, curr] = [0, 1];
while (true) {
[prev, curr] = [curr, prev + curr];
yield curr;
}
}
for (let n of fibonacci()) {
console.log(n);
// truncate the sequence at 1000
if (n >= 1000) {
break;
}
}
```
## 4.其他
但是 ES5 定義了一些其他有用的方法,下面是一部分:
- every: 循環在第一次 return false 后返回
- some: 循環在第一次 return true 后返回
- filter: 返回一個新的數組,該數組內的元素滿足回調函數
- map: 將原數組中的元素處理后再返回
- reduce: 對數組中的元素依次處理,將上次處理結果作為下次處理的輸入,最后得到最終結果。
- 說明
- CSS與HTML
- BFC的特性及其常見應用
- CSS深入理解之margin
- CSS深入理解之line-height
- CSS盒模型相關知識
- CSS知識總結
- HTML知識總結
- 三欄布局五種方式
- JavaScript內置對象
- 1.循環
- 2.數組方法對比
- 3.字符串實用常操紀要
- JavaScript核心
- var、let、const定義變量
- this 的指向問題詳解
- 箭頭函數
- ES6部分知識歸納
- ES6的Class
- Promise和Async/await
- 面向對象的概念及JS中的表現
- 創建對象的九種方式
- JS的繼承
- 閉包總結
- 構造函數與作用域
- 原型與原型鏈
- 函數的四種調用模式
- apply、call、bind詳解
- JavaScript應用
- 1.JavaScript實現深拷貝與淺拷貝
- 2.函數防抖與節流
- 3.無阻塞腳本加載技術
- DOM
- 如何寫出高性能DOM?
- 事件探秘
- 事件委托
- 操作DOM常用API詳解
- 重排和重繪
- 運行機制與V8
- 瀏覽器的線程和進程
- Vue.js
- Vue.js知識點總結
- Vue-Router知識點總結
- 父子組件之間通信的十種方式
- 優化首屏加載
- 關于Vuex
- 前端路由原理及實現
- 在Vue.js編寫更好的v-for循環的6種技巧
- 12個Vue.js開發技巧和竅門
- 網絡協議
- HTTP緩存機制
- UDP協議
- TCP協議
- HTTPS協議
- HTTPS的背景知識、協議的需求、設計的難點
- HTTPS與HTTP的區別
- 框架與架構
- MVC、MVP、MVVM
- Gulp與Webpack的區別
- Angular React 和 Vue的比較
- 虛擬DOM和實際的DOM有何不同?
- 架構問題
- 工程化
- npm link命令
- npm scripts 使用指南
- 前端工程簡史
- 常見的構建工具及其對比
- Webpack基本配置與概念
- 設計模式
- 工廠設計模式
- 單例設計模式
- 適配器模式
- 裝飾器模式