Skip to content

如何创建一个可以无限重复一个或多个值的JavaScript生成器函数?

生成器函数非常灵活,特别是在创建值序列时。您可以使用它们轻松创建一个可以无限重复给定值或值数组的生成器。

重复一个单一值

要创建一个可以无限重复单一值的生成器,可以使用一个非终止的while循环,每次调用Generator.prototype.next()时都会yield一个值。您还可以使用yield语句的返回值来更新返回的值,如果传递的值不是undefined的话。

const repeatGenerator = function* (val) {
  let v = val;
  while (true) {
    let newV = yield v;
    if (newV !== undefined) v = newV;
  }
};

const repeater = repeatGenerator(5);
repeater.next(); // { value: 5, done: false }
repeater.next(); // { value: 5, done: false }
repeater.next(4); // { value: 4, done: false }
repeater.next(); // { value: 4, done: false }

重复一个值数组

要创建一个可以无限重复值数组的生成器,可以使用与之前相同的方法,使用非终止的while循环和每次调用Generator.prototype.next()时都会yield一个值。为了循环遍历数组,可以使用取模运算符(%)和Array.prototype.length来获取下一个值的索引,并在每个yield语句之后递增计数器。

const cycleGenerator = function* (arr) {
  let i = 0;
  while (true) {
    yield arr[i % arr.length];
    i++;
  }
};

const binaryCycle = cycleGenerator([0, 1]);
binaryCycle.next(); // { value: 0, done: false }
binaryCycle.next(); // { value: 1, done: false }
binaryCycle.next(); // { value: 0, done: false }
binaryCycle.next(); // { value: 1, done: false }