【JS】迭代和扩展操作

1、迭代器模式

  • 1.1、迭代器:
    • 迭代器是通过使用next()方法实现迭代器协议的的任何一个对象,该方法返回具有两个属性的对象:value,这是序列中的next值;和done ,如果已经迭代到序列中的最后一值,则它为true。如果 value和done一起存在,则它是迭代器的返回值。
    • 一旦创建,迭代器对象可以通过重复调用next()显示地迭代
  • 1.2、可迭代协议:
    • 可迭代协议允许JS对象定义或定制它们的迭代行为,例如,在一个 for…of 结构中,哪些值可以被遍历到。一些内置类型同时是内置可迭代对象,并且有默认的迭代行为,比如 Array 或者 Map,而其他内置类型则不是(比如 Object))。
    • 要成为可迭代对象,一个对象必须实现 @@iterator 方法。这意味着对象(或者它原型链上的某个对象)必须有一个键为@@iterator的属性,可通过常量[Symbol.iterator]访问该属性
  • 1.3、迭代器协议:
    • 迭代器协议定义了产生一系列值(无论是有限个还是无限个)的标准方式。当值为有限个时,所有的值都被迭代完毕后,则会返回一个默认返回值。
    • 只有实现了一个拥有以下语义(semantic)的 next() 方法,一个对象才能成为迭代器

2、生成器

  • 1、生成器基础:
    • 虽然自定义地迭代器是一个有用的工具,但由于需要显式地维护内部状态,因此需要谨慎地创建
    • 生成器函数提供了一个强大的选择:它允许你定义一个包含有迭代算法的函数,同时它可以自动维护自己的状态
    • 生成器函数使用function*语法编写。 最初调用时,生成器函数不执行任何代码,而是返回一种称为 Generator的迭代器。 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到 yield 关键字
    • 生成器函数在执行时能暂停,后面又能从暂停处继续执行
    • 调用一个生成器函数并不会马上执行它里面的语句,而是返回一个这个生成器的迭代器( iterator )对象。当这个迭代器的next()方法被首次(后续)调用时,其内的语句会执行到第一个(后续)出现yield的位置为止,yield 后紧跟迭代器要返回的值
  • 2、yield
    • 语法
[rv] = yield [expression];
rv:返回传递给生成器的next()方法的可选值,以恢复其执行
expression:定义通过迭代器协议从生成器函数返回的值。如果省略,则返回undefined
    • 描述:yield关键字使生成器函数执行暂停,yield关键字后面的表达式的值返回给生成器的调用者。它可以被认为是一个基于生成器的版本的return关键字。
    • 一旦遇到yield表达式,生成器的代码将被暂停运行,直到生成器的next()方法被调用。每次调用生成器的next()方法时,生成器都会恢复执行,直到达到以下某个值:yield、throw、return、生成器函数的结尾
//调用 next()方法时,如果传入了参数,
//那么这个参数会传给上一条执行的yield语句左边的变量,例如下面例子中的 x 
function *gen(){
    yield 10;
    x=yield 'foo';
    yield x;
}

var gen_obj=gen();
console.log(gen_obj.next());// 执行 yield 10,返回 10
console.log(gen_obj.next());// 执行 yield 'foo',返回 'foo'
console.log(gen_obj.next(100));// 将 100 赋给上一条 yield 'foo' 的左值,即执行 x=100,返回 100
console.log(gen_obj.next());// 执行完毕,value 为 undefined,done 为 true
  • 3、yield*:用于委托给另一个生成器或可迭代对象
  • 4、提前终止迭代器:
    • next()
    • throw():该方法会在暂停的时候将一个提供的错误注入到生成器对象中。如果错误未被处理,生成器就会关闭
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值