1. 何为 Symbol-iterator
Symbol.iterator 为每一个对象定义了默认的迭代器。该迭代器可以被 for…of 循环使用。
ES6 定义了 for...of
方法,可以用来遍历数组的值,其用法如下:
1 | var arr = ["a", "b", "c"]; |
1 | a |
实际上 for...of
循环首先会向被访问的对象请求一个 迭代器对象 ,然后通过调用迭代器对象的 next()
方法来遍历所有返回值。所谓的迭代器对象,就是指数组上本身所内置的 @@iterator
,我们可以通过访问数组的 Symbol.iterator
属性来取到该迭代器:
1 | var arr = ["a", "b", "c"]; |
我们可以利用其进行手动遍历数组:
1 | var arr = ["a", "b", "c"]; |
以下对象都内置了迭代器,也就是说他们可以直接使用 for...of
循环:
- Array.prototype@@iterator
- TypedArray.prototype@@iterator
- String.prototype@@iterator
- Map.prototype@@iterator
- Set.prototype@@iterator
此外,ES6 的展开运算符也是基于迭代器实现的:
1 | let a = [1,2,3] |
2. 迭代器的实现
对于一个普通的 Object 来说,由于其没有内置迭代器所以不能使用 for...of
循环,但是我们只要手动为其挂载上一个迭代器方法,并让其返回一个 next()
方法,每次调用 next()
方法是都返回一个包含 value
与 done
属相的对象,也可以实现对普通对象的 for...of
循环:
1 | var obj = { |
1 | a |
顺带一提,迭代器每一步返回的过程是不是与 Generator 十分相似,我们先来复习一下 Generator 函数的操作:
1 | function* generatorFn() { |
所以利用 Generator 可以更加便捷的实现迭代器:
1 | var obj2 = { |