使任何JavaScript值可迭代

JavaScript的Symbol.iterator是一个非常强大的工具,每个Web开发人员都应该学会如何使用它。它允许你定义和自定义值的迭代方式,从而使任何值都可以进行迭代。你可以轻松地将这个知识应用到普通的JavaScript对象甚至类中。

你只需要正确定义一个生成器函数,使用yield返回每个迭代值。这可以用于从对象中获取键值对、从类中调用特定的getter函数或将数字拆分为数字数组:

const obj = { a: 1, b: 2, c: 3 };

obj[Symbol.iterator] = function* () {
  for (let key of Object.keys(obj)) yield { [key]: obj[key] };
};

[...obj]; // [ { a: 1 }, { b: 2 }, { c: 3 }]

class IterableNumber extends Number {
  *[Symbol.iterator]() {
    for (let digit of [...`${this}`].map(d => Number.parseInt(d))) yield digit;
  }
}

const num = new IterableNumber(1337);
[...num]; // [ 1, 3, 3, 7]