javascript - 关于 Symbol.iterator 和迭代器,iterables
问题描述
在本页面:
https://javascript.info/iterable
他们通过从头构建迭代器来解释迭代器的工作原理:
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
this.current = this.from;
return this;
},
next() {
if (this.current <= this.to) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
}
};
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
基本上,迭代器必须返回一个像这样的对象: { done: boolean, value: current value }
然后使用 for...of 循环开始工作:
for (let num of range) {
alert(num); // 1, then 2, 3, 4, 5
}
所以我们知道 for...of 调用迭代器及其下一个函数。我们只知道它有效。但随后他们解释了我们如何使用以下代码显式调用它们:
let str = "Hello";
// does the same as
// for (let char of str) alert(char);
let iterator = str[Symbol.iterator]();
while (true) {
let result = iterator.next();
if (result.done) break;
alert(result.value); // outputs characters one by one
}
但他们正在调用默认迭代器。他们没有调用他们从头开始制作的迭代器。我认为由于 return 的工作原理,他们从头开始创建的那个是不可能的。那么 for...of 是否具有无法重新创建的特殊功能?就像它知道记住你的价值并从那里继续并且不会在返回时退出一样。
这只是为了帮助我理解。我总是喜欢他们解释如何重新创建现有功能并想知道是否可以在不使用默认迭代器的情况下完全重新创建它。
解决方案
推荐阅读
- angular - SQLite 更新设置列的值而不是给定值。如何解决?
- java - 如何在 JPA 的多对多关系中将作者添加到一本书中?
- java - 去掉论文Itext7中的第一行和最后一行属性
- nuxt.js - Nuxt 应用程序编译耗时超过 4 分钟
- android - Android:Google Drive onActivityResult() 获取 resultCode 0 (RESULT_CANCELED)
- git - 合并两个分支而不丢失根分支的代码
- jwt - 是否可以编辑 JWT 令牌?
- javascript - 在按钮单击 React 时呈现一个额外的弹出对话框
- javascript - 想用javascript实现图片列表界面的旋转
- php - 上传图片工作,但也不工作