*遍歷對象*
* * * * *
比較常見的引用類型有 `Object`、`Array`,下面首先來看下遍歷 `Object` 常用的方法:
```
1.最常用的就是 for in 循環, 循環遍歷對象自身的和繼承的可枚舉屬性(不含Symbol屬性), 該循環會把實例原型對象上面可枚舉的屬性遍歷出來。
let obj = {name: 'zep', age: 25}
Object.prototype.abc = 'abc'
for (let key in obj) {
console.log(obj[key])
}
```

* * * * *
```
2.使用Object.keys(), 返回一個數組,包括對象自身的(不含繼承的)所有可枚舉屬性(不含Symbol屬性), 該循環不會把實例原型對象上面可枚舉的屬性遍歷出來。
let obj = {name: 'zep', age: 25}
Object.prototype.abc = 'abc'
Object.keys(obj).forEach(key => {
console.log(obj[key])
})
```

* * * * *
```
3.使用Object.getOwnPropertyNames(obj)遍歷, 返回一個數組,包含對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性)。
let obj = {name: 'zep', age: 25}
Object.prototype.abc = 'abc'
Object.getOwnPropertyNames(obj).forEach(key => {
console.log(obj[key])
})
```

* * * * *
接下來是遍歷 `Array` 常用的方法:
```
1.最常用的就是普通for循環
let arr = [1, 2, 3, 4]
for (let i = 0, len = arr.length; i < len; i++) {
console.log(arr[i])
}
```
```
2.使用forEach循環, forEach這種方法也有一個小缺陷: 你不能使用break語句中斷循環, 也不能使用return語句返回到外層函數。
let arr = [1, 2, 3, 4]
arr.forEach((val, index) => {
console.log(val, index)
})
```
```
3.使用 map 遍歷, map 即是"映射"的意思, 用法與 forEach 相似, 但是比 forEach 好的一點是 map 支持 return。
let arr = [1, 2, 3, 4]
let result = arr.map((val, index) => {
return val * 2
})
```

* * * * *
```
4.使用 ES6 提供的 for of 循環, 它支持數組、類數組和字符串循環
for of這個方法避開了for in循環的所有缺陷, 與 forEach 不同的是,它可以正確響應break、continue和return語句
缺點是沒有 index, 不能遍歷對象
let arr = [1, 2, 3, 4]
for (let val of arr) {
console.log(val)
}
```
