【前端面试】七、算法-迭代器和生成器

目录

1.迭代器

2.生成器


1.迭代器

  • lterator:也被称作游标Cursor,是一种设计模式。迭代器提供了一种遍历内容的方法(比如 JS 迭代器中的next),而不需要关心内部构造。
    // 迭代器的遍历
    const s = new Set([1,2,3,4,5])
    const it = s.values()
    // console.log(it); // SetIterator {1, 2, 3, 4, 5}

    const it1 = s.values()
    // console.log([...it1]); // [1, 2, 3, 4, 5]

    const it2 = s.values()
    for (const val of it2) {
      // console.log(val); // 1 2 3 4 5
    } 

    let val = null
    while(!(val = it.next()).done) {
      // console.log(val);
      // {value: 1, done: false}
      // {value: 2, done: false}
      // {value: 3, done: false}
      // {value: 4, done: false}
      // {value: 5, done: false}
    }

    /* Array.from(arrayLike, mapFn, thisArg)
      arrLike:想要转换成数组的伪数组对象或可迭代对象
      mapFn:如果指定了该参数,新数组中的每个元素会执行该回调函数
      thisArg:可选参数,执行回调函数 mapFn 时 this 对象 
    */
   const it3 = s.values()
   const arr = Array.from(Array(5), it3.next, it3).map(x => x.value) // [1, 2, 3, 4, 5]

2.生成器

Generator:生成器,也是一种设计模式,用于构造复杂对象, JS 中的生成器,用于构造迭代器。

  •         简化语法、写起来少考虑一些变量
  •         节省空间(示例中函数体不需要定义数组承载值)
  •         分散执行片段(节省单位时间的处理量),对于单线程的前端非常重要
  •         构造异步语法 
    // 生成器构造无穷斐波那契数列
    function* fibonacci() {
      let [prev, curr] = [1, 1]
      yield prev
      yield curr
      while(true) {
        [prev, curr] = [curr, prev + curr]
        yield curr
      }
    }

    const fib = fibonacci()
    const fib10 = Array.from(Array(10), fib.next, fib).map(x => x.value)
    // console.log(fib10) // [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

    // Generator异步语法
      function request (url) {
      return cb => {
        setTimeout(() => {
          cb(url) // 模拟异步操作,当异步操作完成后,再次调用run函数
        }, 1000)
      }
    }
 
    function createRunner (genFunc) {
      const it = genFunc()
      function run (data) {
        const result = it.next(data)
        if (result.done) return
        result.value(run) // 传入run函数,当异步操作完成后,再次调用run函数
      }
      return run()
    }

    function* genFunc() {
      const res1 = yield request('url1')
      console.log(res1)
      const res2 = yield request('url2')
      console.log(res2)
    }
 
    createRunner(genFunc)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值