是否可以在没有变量的情况下创建for-of循环?

sdg*_*sdh 11 javascript for-loop

假设我有这样的函数:

const hasAny = xs => {
  for (const x of xs) {
    return true;
  }

  return false;
};
Run Code Online (Sandbox Code Playgroud)

会抱怨x没有使用,事实上并非如此.

我可以编写一个不声明任何变量的for-of循环吗?

T.J*_*der 13

不,你不能,不是一般情况.¹你可以直接使用iterator²,但是:

const hasAny = xs => !xs[Symbol.iterator]().next().done;
Run Code Online (Sandbox Code Playgroud)

或者如果你想确保主动释放迭代器所拥有的任何资源(而不是等待它们自动释放 - 想想生成器函数中的数据库连接或类似的东西),return如果它提供了一个return(不是全部),那么主动调用它for-of在幕后:

const hasAny = xs => {
    const it = xs[Symbol.iterator]();
    const result = !it.next().done;
    if (it.return) it.return();
    return result;
};
Run Code Online (Sandbox Code Playgroud)

实例:

const hasAny = xs => !xs[Symbol.iterator]().next().done;

console.log(hasAny([]));  // false
console.log(hasAny([1])); // true
Run Code Online (Sandbox Code Playgroud)


¹如果你确定迭代器的第一个值不是null或者undefined,你可以做这个解构技巧.

² 对于任何不了解的人,for-of使用封底下的迭代器.