SOURCE

console 命令行工具 X clear

                    
>
console
let arr = ['a', 1, 2, 3];
let iter = arr[Symbol.iterator]();
// console.log('iter.next()', iter.next())
// console.log('iter.next()', iter.next())
// console.log('iter.next()', iter.next())
// console.log('iter.next()', iter.next())
// console.log('iter.next()', iter.next())
/* 
iter.next() {value: "a", done: false}
iter.next() {value: 1, done: false}
iter.next() {value: 2, done: false}
iter.next() {value: 3, done: false}
iter.next() {value: undefined, done: true}
*/

/* 为对象添加Iterator接口方法 */
var obj = {
  data: ['hello', 'world'],
  [Symbol.iterator]() {
    const self = this;
    let index = 0;
    return {
      next() {
        if(index < self.data.length) {
          return {
            value: self.data[index++],
            done: false
          }
        } else {
          return {value:undefined, done: true}
        }
      }
    }
  }
}
for (let item of obj) {
  console.log(item)
}
<p>Iterator的作用:</p>
<ol>
  <li>为各种数据结构,提供一个统一的、便捷的访问接口</li>
  <li>使得数据结构的成员能够按照某种次序排列</li>
  <li>es6创造了一种新的遍历命令for ... of循环,Iterator主要供for ... of循环</li>
</ol>

<p>ES6 规定,默认的 Iterator 接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有Symbol.iterator属性,就可以认为是“可遍历的”(iterable)。Symbol.iterator属性本身是一个函数,就是当前数据结构默认的遍历器生成函数。执行这个函数,就会返回一个遍历器。至于属性名Symbol.iterator,它是一个表达式,返回Symbol对象的iterator属性,这是一个预定义好的、类型为 Symbol 的特殊值,所以要放在方括号内(参见《Symbol》一章)。</p>

<h3>原生具备Iterator接口的数据结构:</h3>
<ol>
  <li>Array</li>
  <li>Map</li>
  <li>Set</li>
  <li>String</li>
  <li>TypedArray</li>
  <li>函数的 arguments 对象</li>
  <li>NodeList 对象</li>
</ol>