若是一个对象部署了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