Skip to content

Iterator迭代器 #11

@Chersquwn

Description

@Chersquwn

迭代器是一个对象,通过使用 next() 方法实现 Iterator protocol 的任何一个对象,该方法返回具有两个属性的对象: value,这是序列中的 next 值;和 done ,如果已经迭代到序列中的最后一个值,则它为 true 。如果 valuedone 一起存在,则它是迭代器的返回值。

Symbol.iterator

要成为可迭代对象, 一个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性。

Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for...of 循环使用。

内置可迭代对象有:StringArrayTypedArrayMapSet

将一个类或对象实现可迭代

class IteratorUser {
  public name = ''
  public age = 0

  public constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }

  public say(greeting: string) {
    console.log(`${greeting}, ${this.name}`)
  }

  public [Symbol.iterator]() {
    let index = 0
    const keys = [
      ...Object.getOwnPropertyNames(this),
      ...Object.getOwnPropertyNames(Object.getPrototypeOf(this))
    ]

    return {
      next: () => {
        return {
          value: keys[index],
          done: index++ === keys.length
        }
      }
    }
  }
}

const user = new IteratorUser('Tom', 24)

user.say('Hi')

for (let i of user) {
  console.log(i)    // name, age, constructor, say
}

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