有两个协议:
可迭代协议
和
迭代器协议
。
可迭代协议
可迭代
协议允许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个
for..of
结构中什么值可以被循环(得到)。一些内置类型都是内置的可遍历对象并且有默认的迭代行为, 比如
Array
or
Map
, 另一些类型则不是 (比如
Object
) 。
为了变成可遍历对象, 一个对象必须实现
@@iterator
方法, 意思是这个对象(或者它原型链
prototype chain
上的某个对象)必须有一个名字是
Symbol
.iterator
的属性:
属性
|
值
|
[Symbol.iterator]
|
返回一个对象的无参函数,被返回对象符合迭代器协议。
|
当一个对象需要被遍历的时候(比如开始用于一个
for..of循环中
),它的
@@iterator
方法被调用并且无参数,然后返回一个用于在遍历中获得值的迭代器。
迭代器协议
该
迭代器
协议定义了一种标准的方式来产生一个有限或无限序列的值。
当一个对象被认为是一个迭代器时,它实现了一个
next()
的方法并且拥有以下含义:
属性
|
值
|
next
|
返回一个对象的无参函数,被返回对象拥有两个属性:
done
(boolean)
如果迭代器可以产生序列中的下一个值,则为 false。这等效于连同 done 属性也不指定。
value
- 迭代器返回的任何 JavaScript 值。done 为 true 时可省略。
|
生成器对象到底是一个迭代器还是一个可迭代对象?
生成器对象
既是迭代器也是可迭代对象:
var
aGeneratorObject
=
function
*
(){
yield
1
;
yield
2
;
yield
3
;
}();
typeof
aGeneratorObject
.
next
;
// "function", because it has a next method, so it's an iterator
typeof
aGeneratorObject
[
Symbol
.
iterator
];
// "function", because it has an @@iterator method, so it's an iterable
aGeneratorObject
[
Symbol
.
iterator
]()
===
aGeneratorObject
;
// true, because its @@iterator method return its self (an iterator), so it's an well-formed iterable
[...
aGeneratorObject
];
// [1, 2, 3]