若是一個對象部署了iterator接口那就能被for...of 遍歷。而且for...of 只能遍歷部署了iterator接口的對象。以下對象:javascript
例子以下:java
let arr = ["aa",2,3,40]; for (let i of arr){ console.log(i);//aa 2 3 40 } let str = "dsfe3e2"; for (let i of str){ console.log(i);//d s f e 3 e 2 } function add() { for (let i of arguments){ console.log(i);//1 2 3 45 234 } } add(1,2,3,45,234);
咱們也能夠在一個自定義的對象上部署iterator接口,當使用for...of 遍歷某個對象時,實際上是調用這個對象的Symbol.iterator方法(Symbol.iterator是Symbol內置的一個Symbol值)。因此咱們只須要在對象上增長一個Symbol.iterator方法,這個對象就能被for...of 遍歷。es6
let obj = { a : 1, [Symbol.iterator]: function* () { //遍歷器 yield 1; yield* [2,3,4]; yield 5; } }; for (let i of obj){ console.log(i);//1 2 3 4 5 }
上面的代碼,obj對象中定義了一個名字爲Symbol.iterator的方法。使用for...of就會調用這個方法。數組
函數Symbol.iterator的聲明使用了function*,使得Symbol.iterator函數成爲一個generator,而且能夠在其中裏面使用yield關鍵字,obj的Symbol.iterator方法返回一個generator對象,經過next()依次調用。函數
更多詳細,參考http://es6.ruanyifeng.com/#docs/iteratorspa