微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一个关于Javascript Iterator中执行顺序的问题

如何解决一个关于Javascript Iterator中执行顺序的问题

class iteratorWithoutG {
  [Symbol.iterator]() {
    let val = 0;
    let threshold = 10;
    return {
      next() {
        if(val >= threshold) {
          console.log('iteratorWithoutG is finished');
          return {
            done: true,value: undefined
          } 
        }
        return {
          done: false,value: vaL++
        }
      },return() {
        return {
          done: true,value: undefined
        } 
      }
    }
  }
}
const iWithoutG = new iteratorWithoutG(10);
console.log([...iWithoutG]);

我正在学习有关 JS 迭代器的知识,我得到了这个:

iteratorWithoutG is finished
[ 0,1,2,3,4,5,6,7,8,9 ]

我想知道为什么在Array之前显示String,所以我添加了一些日志:

class iteratorWithoutG {
  [Symbol.iterator]() {
    let val = 0;
    let threshold = 10;
    return {
      next() {
        if(val >= threshold) {
          console.log('iteratorWithoutG is finished');
          console.log(Date.Now())
          return {
            done: true,value: (vaL++,Date.Now())
        }
      },value: undefined
        } 
      }
    }
  }
}

这次我收到这条消息:

iteratorWithoutG is finished
1610466807875
[ 1610466807872,1610466807872,1610466807872 ]

所以字符串其实是在Array之后生成的,但是怎么显示在Array之前呢?? Array 是否存储在某个地方?

解决方法

这一行:

console.log([...iWithoutG]);

脱糖:

{
  let arr = [];
  for (const e of iWithoutG) {
    arr.push(e);
  }
  console.log(arr);
}

这意味着首先创建并填充数组,然后才调用 console.log()。因此迭代器在调用 console.log() 之前完成。

完整的事件顺序:

  1. 数组和迭代器已初始化。
  2. 调用迭代器的 next() 方法,直到它完成并将结果推送到数组中。
  3. 迭代器完成。
  4. 数组被记录到控制台。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。