Interator遍历接口和for...of遍历

Iterator和for…of循环

Iterator(遍历器)的概念

Iterator作用

1,为各种数据解构,提供一个统一的,简便的访问接口

2.是数据解构的成员能够按某种次序排列

3,创造一种新的遍历命令for…of循环,Interator接受主要供for…of消费

Iterator的遍历过程就是不断调用next方法,直到指针指向结束为止,

每次返回一个包含value和done两个属性的对象,value是成员的值,done属性是一个布尔值判断是否遍历结束

Iterator接口

默认的Iterator接口不熟在数据结构的Symbol.iterator属性,这是一个函数,执行返回一个遍历器.

原生具备Interator接口的数据结构为

  • Array
  • Map
  • Set
  • String
  • TypedArray
  • 函数的 arguments 对象
  • NodeList 对象

    let arr = [‘a’, ‘b’, ‘c’];
    let iter = arrSymbol.iterator;

    iter.next() // { value: ‘a’, done: false }
    iter.next() // { value: ‘b’, done: false }
    iter.next() // { value: ‘c’, done: false }
    iter.next() // { value: undefined, done: true }

调用Iterator接口的场合

(1)解构赋值

(2)扩展运算符

(3)yield*

(4)其他场合

字符串的 Iterator 接口

var someString = "hi";
typeof someString[Symbol.iterator]
// "function"

var iterator = someString[Symbol.iterator]();

iterator.next()  // { value: "h", done: false }
iterator.next()  // { value: "i", done: false }
iterator.next()  // { value: undefined, done: true }

Iterator 接口与 Generator 函数

Symbol.iterator方法的最简单实现,还是使用下一章要介绍的 Generator 函数。

let myIterable = {
  [Symbol.iterator]: function* () {
    yield 1;
    yield 2;
    yield 3;
  }
}
[...myIterable] // [1, 2, 3]

// 或者采用下面的简洁写法

let obj = {
  * [Symbol.iterator]() {
    yield 'hello';
    yield 'world';
  }
};

for (let x of obj) {
  console.log(x);
}
// "hello"
// "world"

遍历器对象的 return(),throw()

遍历器对象除了具有next方法,还可以具有return方法和throw方法。如果你自己写遍历器对象生成函数,那么next方法是必须部署的,return方法和throw方法是否部署是可选的

用于for…of循环提前退出,就会调用return方法,下面三种情况会触发return方法

// 情况一
for (let line of readLinesSync(fileName)) {
  console.log(line);
  break;
}

// 情况二
for (let line of readLinesSync(fileName)) {
  console.log(line);
  continue;
}

// 情况三
for (let line of readLinesSync(fileName)) {
  console.log(line);
  throw new Error();
}

你可能感兴趣的:(es6)