迭代器,可迭代对象,生成器之间的关系

create on in javascript with 0 comment and 120 view

Array, String, Set, Map,迭代器,生成器,for in循环,for of循环…它们之间有什么联系呢。

Iterables 可迭代对象

可迭代对象可以使用for of遍历,Array,String,Set,Map都属于可迭代对象。

Iterable Protocol

需要实现一个 ECMA @@iterator 方法,即在键 [Symbol.iterator] 上提供一个方法。对象被 for…of 调用时,这个方法会被调用。方法应该返回一个迭代器对象(Iterator)用来迭代。

实现了 Iterable Protocol 的对象称为 可迭代对象(Iterables)

Iterator 迭代器对象

Iterator Protocol

又称 Iteration Protocol,需要实现一个 next() 方法,每次调用会返回一个包含 value(当前指向的值)和 done(是否已经迭代完成)的对象。

实现了 Iterator Protocol 的对象称为 迭代器对象(Iterator)。
通常,要获取迭代器对象(Iterator ),可调用可迭代对象的 Symbol.iterator 方法,其返回值则为Iterator,例如 let iterator = arr[Symbol.iterator]()

自定义 Iterator

除了 Array、Map 等标准的全局对象外,自定义对象可通过提供一个 Symbol.iterator 成为可迭代对象。

Generator 生成器

ES6为了更方便实现自定义迭代器(即实现Symbol.iterator方法)而提供的一种方案。

原始写法:

let obj = { [Symbol.iterator]: function () { let a = 0, b = 0 return { next: function () { let value = 0 if (!a) { value = a = 1 } else if (!b) { value = b = 1 } else if (b < 50){ value = a + b a = b b = value } return {done: value === 0, value} } } } } for (let i of obj) { console.log(i) // 1 1 2 3 5 8 13 21 34 55 }

Generator写法:

let obj = { [Symbol.iterator]: function *() { let a = 1, b = 1 yield a yield b while (b < 50) { yield b = a + b a = b - a } } } for (let i of obj) { console.log(i) // 1 1 2 3 5 8 13 21 34 55 }

Map, Set, String, Array相互转化

Array -> Set

new Set([1, 2, 3]) // or new Set([1, 2, 3][Symbol.iterator]())

Set -> Array

let set = new Set([1, 2, 3]) Array.from(set) // or Array.from(set[Symbol.iterator]())

String -> Set

let str = ‘abcdefg’
new Set(str) // {‘a’, ‘b’, ‘c’…}
// or
new Set(strSymbol.iterator)

Object -> map

let name = {“name”: “leo”}
new Map(Object.entries(name)) // {“name” => “leo”}

😁😂😃😄😅😆😇😈😉😐😑😒😓😔😕😖😗😘😙😠😡😢😣😤😥😦😧😨😩😰😱😲😳😴😵😶😷😸😹🙀🙁🙂🙃🙄🙅🙆🙇🙈
🙂