迭代协议,迭代器和生成器
- 迭代协议
迭代协议并不是新的内置实现或语法,而是协议。这些协议可以被任何遵循某些约定的对象来实现。
迭代协议具体分为两个协议: 可迭代协议 和 迭代器协议。 - 可迭代协议
个人理解:
-
官方解释:一个数据类型,内置了Symbol.iterator接口,那么就可以用for...of, ... 等遍历;如果没有内置,那就需要手动部署一个接口,该接口返回的对象需要符合迭代器协议(下文有迭代器协议)
-
可迭代协议允许 JavaScript 对象定义或定制它们的迭代行为,例如,在一个 for..of 结构中,哪些值可以被遍历到。一些内置类型同时是内置的可迭代对象,并且有默认的迭代行为,比如 Array 或者 Map,而其他内置类型则不是(比如 Object)。
-
要成为可迭代对象,该对象必须实现 @@iterator 方法,这意味着对象(或者它原型链上的某个对象)必须有一个键为 @@iterator 的属性,可通过常量 Symbol.iterator 访问该属性:
-
[Symbol.iterator]
-
一个无参数的函数,其返回值为一个符合迭代器协议的对象
- 迭代器协议
个人理解:
-
每次调用next时,返回一个对象;有值时返回:{value:xxx, done:false}, 遍历迭代结束时返回{done:true}
let obj = {a:1,b:2} obj[Symbol.iterator] = function(){ let keys = ['a', 'b'] let index = 0 return { next:()=> index !== keys.length ? {value: this[keys[index++]], done:false} : {done:true} } } let a = obj[Symbol.iterator](); //获取迭代器对象 a.next(); // 遍历开始,获取迭代的第一个值 1 a.next(); // 获取迭代的第二个值 2 a.next(); // 迭代器内部消耗完毕,从这个开始后续只返回 {done:true}
官方解释:
-
迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式,当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。
- 生成器
个人理解:
-
生成器帮我们管理了done状态,我们直接返回值就行了,声明时需要加个星号;每次调用next,就内部在yield关键字处停止,返回yield 关键字后面的值(类似return 关键字)
let obj = {a:1,b:2}; obj[Symbol.iterator] = function* (){ yield obj.a; yield obj.b; }; let a = obj[Symbol.iterator](); //获取迭代器对象 a.next(); // 遍历开始,获取迭代的第一个值 {value: 1, done: false} a.next(); // 获取迭代的第二个值 {value: 2, done: false} a.next(); // 迭代器内部消耗完毕,从这个开始后续只返回 {value: undefined, done:true}
本文来自博客园,作者:Math点PI,个性签名:“不写bug怎么进步?”,转载请注明原文链接:https://www.cnblogs.com/MrZhous/p/17029541.html