0Pricing
JavaScript Academy · 课时

可迭代协议与 for...of

学习可迭代协议:Symbol.iterator、iterator.next(),以及在小型自定义示例中使用 for...of、展开语法和 Array.from

可迭代协议与 for...of 是 CoddyKit 上的免费 JavaScript Academy 课时。 这是第 1 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 JavaScript Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 JavaScript Academy 课程共包含 3 节课。

整体概览

目标:阅读并构建小型可迭代对象。

  • 了解 iterable 的含义
  • 了解 Symbol.iterator 和 iterator.next()
  • 了解 for...of、展开、Array.from
  • 构建一个 0..N 计数器示例
可迭代协议与 for...of — 插图 1

在内置对象上使用 for...of

for...of 可用于数组和字符串等内置可迭代对象,并按顺序产生其中的项目。

// Arrays and strings are iterable
const arr = [10, 20, 30];
for (const n of arr) {
  console.log("arr item:", n);
}

const word = "JS";
for (const ch of word) {
  console.log("char:", ch);
}
可迭代协议与 for...of — 插图 2

自定义可迭代对象

iterable 包含一个 [Symbol.iterator](),该方法返回一个迭代器,其 next() 会产生 { value, done }。

// A tiny iterable that counts 0..max-1
const Counter = {
  make: function (max) {
    return {
      max: max,
      // Symbol.iterator returns an iterator object
      [Symbol.iterator]: function () {
        let i = 0;
        return {
          next: function () {
            if (i < max) {
              const out = { value: i, done: false };
              i = i + 1;
              return out;
            }
            return { value: undefined, done: true };
          }
        };
      }
    };
  }
};

for (const x of Counter.make(3)) {
  console.log("count:", x);
}
可迭代协议与 for...of — 插图 3

手动迭代

在底层,for...of 会反复调用 next(),直到 done: true。

// You can drive the iterator manually
const iterable = Counter.make(2);
const it = iterable[Symbol.iterator]();

console.log(it.next()); // { value: 0, done: false }
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: undefined, done: true }
可迭代协议与 for...of — 插图 4

展开与 Array.from

展开和 Array.from 也会使用可迭代协议来收集值。

// Spread (...) and Array.from consume iterables
const small = Counter.make(4);
const a1 = [...small];
const a2 = Array.from(Counter.make(3));

console.log("spread:", a1);
console.log("from :", a2);
可迭代协议与 for...of — 插图 5

良好习惯

提示:

  • 每次在 [Symbol.iterator] 中返回一个新的迭代器。
  • 始终以 done: true 结束,以避免无限循环。
  • 将状态保存在迭代器闭包内部。
可迭代协议与 for...of — 插图 6

可迭代协议测验

快速检查:让对象可迭代。

可迭代协议与 for...of — 插图 7

回顾

回顾:数组等内置对象是可迭代的。要创建自己的可迭代对象,请添加 [Symbol.iterator](),使其返回一个带有 next() 的迭代器。使用 for...of、展开或 Array.from 消费值。

可迭代协议与 for...of — 插图 8

常见问题解答

「可迭代协议与 for...of」课时是免费的吗?

是的 — 「可迭代协议与 for...of」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 JavaScript Academy 课程的其余内容,请升级到 CoddyKit PRO。 JavaScript Academy 课程共包含 3 节课。

「可迭代协议与 for...of」这节课中我会学到什么?

学习可迭代协议:Symbol.iterator、iterator.next(),以及在小型自定义示例中使用 for...of、展开语法和 Array.from 你通过在浏览器中直接运行的动手代码来练习 JavaScript Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 JavaScript Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 JavaScript Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 3 节。

「可迭代协议与 for...of」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 JavaScript Academy 课中编写并运行代码吗?

能。每节 JavaScript Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 可迭代协议与 for...of
  2. 生成器函数、yield 与小型数据处理流程
  3. 异步迭代器——for await...of 与异步生成器
← 返回 JavaScript Academy