Skip to content

关于 Iterator #2

Description

@jpuncle

接口定义(typescript)

// 当次迭代结果
interface IteratorResult {
  done: boolean;
  value: any;
}
// 迭代器
interface Iterator {
  next(): IteratorResult;
}
// 可迭代对象,比如
// Array、Map、Set等;
// Generator(生成器) 函数;
// 自定义可迭代对象
interface Iterable {
  [Symbol.iterator](): Iterator
}

interface Generator extends Iterator {
  next(value?: any): IteratorResult;
  throw(exception: any);
}

自定义可迭代对象

let fibonacci = {
  [Symbol.iterator]() {
    let pre = 0, cur = 1;
    return {
      next() {
        [pre, cur] = [cur, pre + cur];
        return { done: false, value: cur }
      }
    }
  }
}

for (var n of fibonacci) {
  // truncate the sequence at 1000
  if (n > 1000)
    break;
  console.log(n);
}

借助 for..of 可以方便地遍历迭代器,否则就要自己创建迭代器,并且依次调用 next() 来完成遍历。

数组的例子

// 数组,可迭代对象
let arr = ['a', 'b', 'c'];
// 迭代器,通过 [Symbol.iterator]() 创建
let iter = arr[Symbol.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 }

Generator 函数的例子

// Generator 函数,可迭代对象
function* helloWorldGenerator() {
  yield 'hello';
  yield 'world';
  return 'ending';
}
// Generator 迭代器,创建方式类似普通函数调用
var hw = helloWorldGenerator();

hw.next() // { value: 'hello', done: false }
hw.next() // { value: 'world', done: false }
hw.next() // { value: 'ending', done: true }
hw.next() // { value: undefined, done: true }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions