Angular学习笔记56:TypeScript基础-- iterator和generator(next函数、return函数、throw函数)

这篇Angular学习笔记详细探讨了TypeScript中的Iterator和Generator。Iterator使得对象可迭代,如Array、Map等实现了`Symbol.iterator`接口。通过for...of可遍历,而for...in则遍历对象的键。Generator函数产生懒迭代器,调用next()执行并暂停在yield处,可通过next传值,结合return和throw处理流程控制。
摘要由CSDN通过智能技术生成

Angular学习笔记55:TypeScript基础–基本类型之后
现在来看看 iterator、generator和interface

iterator

当一个对象实现了Symbol.iterator的时候,就可以把这个对象认为是可迭代的。对象的Symbol.iterator函数负责返回迭代的值

常见的实现了Symbol.iterator的内置类型

  • array
  • map(ES6)
  • string
  • Set(ES6)
  • int32Array
  • uint32Array

在ES6中,内置对象Map和Set已经实现了Symbol.iterator方法,在ES5,ES3,迭代器只允许在array类型上使用,在非数组值上使用for…of语句会得到一个错误。

for…of 、 for…in

for…of 和 for…in 都可以迭代(遍历)一个数组,但是两者有很大的区别,for…of 迭代的是对象的值,for…in 迭代的是对象的键,也可以操作任何对象,提供了查看对象属性的一种方法。

const array = [7, 8, 9];
for(let i in array){
    console.log(i); // 0, 1, 2
}

for(let i of array){
    console.log(i); // 7, 8, 9
}

generator

function* 是用来创建 generator 函数的语法,调用 generator 函数时会返回一个 generator 对象。常用 next,return和throw函数。

generator 函数用于创建懒迭代器

function* initList() {
      for (let i = 0; i < 3; i++) {
        yield i++;
      }
    }

    const initGenerator = initList();
    console.log(initGenerator.next()); //{value: 0, done: false}
  • 当直接调用generator函数时,并不会立即执行,只会创建一个generator对象
  • generator 对象只会在调用 next 时才开始执行
  • 函数在执行到 yield 语句
  • 函数在next被调用时继续恢复执行

通过next传值

function* generatorInfo() {
      const name = yield;
      console.log('hello' + name);
    }

    const initGeneratorInfo = generatorInfo();
    console.log(initGeneratorInfo.next()); // {value: undefined, done: false}
    console.log(initGeneratorInfo.next('W先生'));
    // helloW先生
    // {value: undefined, done: true}

return 函数

function* generatorInfo() {
      const name = yield;
      console.log('hello' + name);
    }

    const initGeneratorInfo = generatorInfo();
    console.log(initGeneratorInfo.return());
    // {value: undefined, done: true}
    console.log(initGeneratorInfo.return('W先生...'));
    // {value: "W先生...", done: true}

throw 函数

generator 也可以捕获到error

function* generatorError() {
      try {
        yield 0;
      } catch (e) {
        console.log(e.message);
      }
    }

    const initGeneratorError = generatorError();
    console.log(initGeneratorError.next());
    // {value: 0, done: false}
    console.log(initGeneratorError.throw(new Error('发生错误')));
    // 发生错误
    // {value: undefined, done: true}
  • generator 外部是可以传递一个值到 generator 函数体内
  • generator 外部是可以抛入一个异常到 generator 函数体内
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值