是否可以创建不带变量的for-of循环?

时间:2018-10-05 14:19:19

标签: javascript for-loop

假设我有一个像这样的函数:

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

  return false;
};

将抱怨未使用x,实际上并没有使用。

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

3 个答案:

答案 0 :(得分:13)

不,您不能,通常情况下不会。¹不过,您可以直接使用迭代器²,

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

或者,如果您想确保主动释放迭代器拥有的任何资源(而不是等待它们自动释放,请考虑使用生成器函数或类似功能中的数据库连接),如果需要,主动调用return提供return的功能(并非全部提供),就像for-of的功能一样:

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

实时示例:

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

console.log(hasAny([]));  // false
console.log(hasAny([1])); // true


¹如果您确定迭代器的第一个值不是nullundefined,则可以执行this destructuring trick

²对于任何不认识的人,for-of在幕后使用迭代器。

答案 1 :(得分:1)

您可以对空对象使用解构:

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

  return false;
};

更新:当列表包含undefined时,此功能不起作用。

答案 2 :(得分:1)

根据ESLint问题#2173,您可以设置注释以忽略未使用的变量。为此,请使用以下代码:

var some_unused_variable; // eslint-disable-line no-unused-vars

ESLint的社区成员还指出:

  

我们现在有一个varsIgnorePattern选项可用于该用例(最适合忽略所有文件中特定的未使用的变量名或模式)。

文档说明:

  

varsIgnorePattern选项指定不检查使用情况的异常:名称与正则表达式模式匹配的变量。例如,名称包含忽略或忽略的变量。

     

{“ varsIgnorePattern”:“ [iI] gnored”}选项的正确代码示例:

/*eslint no-unused-vars: ["error", { "varsIgnorePattern": "[iI]gnored" }]*/

var firstVarIgnored = 1;
var secondVar = 2;
console.log(secondVar);