ES6语法特性(二)迭代器 生成器 Promise

ES6

迭代器

迭代器就是为实现对不同集合进行统一遍历操作的一种机制,只要给需要遍历的数据结构部署Iterator接口,通过调用该接口,或者使用消耗该接口的API实现遍历操作。

ES6为迭代器引入了一个隐式的标准化接口。Javascript许多内建的数据结构,例如Array、Map、Set、String、TypedArray、函数的 arguments 对象、NodeList 对象都具备 Iterator 接口。
Iterator接口主要为for of 使用,for of(遍历的是value
) 不同于for in(遍历的是key)

      const arr = [4, 3, 2, 1];
      for (let v of arr) {
   
        console.log(v);  // 4 3 2 1
      }

可以通过在控制台打印一个Array实例,查看其原型上具有一个Symbol.iterator属性(Symbol.iterator其实是Symbol(‘Symbol.iterator’)的简写,属性名是Symbol类型代表着这个属性的唯一以及不可重写覆盖),它就是迭代器函数,执行这个函数,就会返回一个迭代器对象,对象下有一个next()方法。

next()迭代
在获得数组最后一位元素的时候,迭代器不会报告done:true,这时候需要再次调用next(),越过数组结尾的值,才能得到完成信号done:true。
通常情况下,在已经迭代完毕的迭代器对象上继续调用next方法会继续返回{value: undefined, done: true}而不会报错。

实现自定义遍历的数据

自定义遍历obj的list数据,而非obj

      const obj = {
   
        name: 'gg',
        list: ['a', 'b', 'c', 'd', 'e'],
        [Symbol.iterator]() {
   
          let index = 0;
          return {
   
            next: () => {
   
              if (index < this.list.length) {
   
                const result = {
    value: this.list[index], done: false };
                index++;
                return result;
              } else return {
    value: undefined, done: true };
            }
          };
        }
      };

      for (let v of obj) {
   
        console.log(v);
      }

在这里插入图片描述

生成器

生成器就是一个特殊的函数,是针对于异步编程一个新的解决方案。function 和函数名之间加个 *
返回的是一个迭代器对象 可以使用next() 方法调用
yield 函数代码的分隔符

      function* gen() {
   
        console.log('1');
        yield 'a'; // 函数代码的分隔符
        console.log('2');
        yield 'b';
        console.log('3');
        yield 'c';
      }
      let iterator = gen(); // 返回的是一个迭代器对象 可以使用next() 方法调用
      iterator.next(); // 1
      iterator.next(); // 2
      iterator.next(); // 3
      console.log(iterator.next());
      console.log(iterator.next());
      console.log(iterator.next());

在这里插入图片描述

迭代器对象 即可使用for of
输出的为yield后面的代码

      function* gen() {
   
        yield 'a'; // 函数代码的分隔符
        yield 'b';
        yield 'c';
      }
      for (let v of gen()) {
   
        console.log(v); // a b c
      }
生成器传递参数

next()方法传递的参数将作为上一个yield的返回值

      function* gen(arg) {
   
        console.log(arg);
        let one = yield 111;
        console.log(one);
        let two = yield 222;
        console.log(two);
        let three = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值