迭代协议

有两个协议: 可迭代协议 迭代器协议
可迭代协议
可迭代 协议允许 JavaScript 对象去定义或定制它们的迭代行为, 例如(定义)在一个  for..of  结构中什么值可以被循环(得到)。一些内置类型都是内置的可遍历对象并且有默认的迭代行为, 比如  Array  or  Map , 另一些类型则不是 (比如 Object ) 。
为了变成可遍历对象, 一个对象必须实现  @@iterator  方法, 意思是这个对象(或者它原型链 prototype chain 上的某个对象)必须有一个名字是  Symbol .iterator  的属性:
属性
[Symbol.iterator]
返回一个对象的无参函数,被返回对象符合迭代器协议。
当一个对象需要被遍历的时候(比如开始用于一个 for..of循环中 ),它的 @@iterator 方法被调用并且无参数,然后返回一个用于在遍历中获得值的迭代器。
迭代器协议
迭代器 协议定义了一种标准的方式来产生一个有限或无限序列的值。
当一个对象被认为是一个迭代器时,它实现了一个  next()  的方法并且拥有以下含义:
属性
next
返回一个对象的无参函数,被返回对象拥有两个属性:
done  (boolean)
如果迭代器已经经过了被迭代序列时为 true。这时 value 可能描述了该迭代器的返回值。返回值在 这里 有更多解释。
如果迭代器可以产生序列中的下一个值,则为 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]

猜你喜欢

转载自blog.csdn.net/taoqilin/article/details/79516337