JSHint - 期望一个条件表达式,而不是一个赋值

JSHint -Expected a conditional expression and instead saw an assignment

我很清楚类似的问题,但我仍然无法根据这些解决我的问题。

因此,我的代码如下所示:

for (var e, i = 0; e = formErrors[i]; i += 1)

JSHint returns 表示 char 39 有错误,所以在 formErrors[i] 之后加上 ;。我能做什么?

e = formErrors[i] 是一个赋值,你不想要一个条件吗?在这种情况下,在 i=0 之后使用逗号,否则在分号之后添加条件。

通常,for循环中的中间元素是用于决定是否继续循环的条件。你在那里有一个任务,如果你想要一个条件,你应该使用 e === formErrors[i] (或使用双 =,但通常不推荐这样做)。

赋值在技术上是可行的,因为 e 可以是例如某个对象 (true) 或 null (false)。但这通常被认为是糟糕的编码风格,并且不会产生非常可读的代码。

JSHint 警告您存在潜在错误。预计 for 语句的第二部分将是一个布尔表达式。通常,您会为此使用一种比较运算符(=====!=> 等)。由于表达式是 e = formErrors[i] ,因此看起来可能是一个错误,可能是由于缺少等号。这是一个常见的错字,会导致很多错误。

显然,在这种情况下,这不是一个错误,而是有意使用这样一个事实,即任何表达式的计算结果都是某个东西,而赋值表达式的计算结果是指定的值:

var x;

alert(x = 1);

因此 for 语句实际上为 e 分配了一个新值,但也将该值作为条件求值,如果需要则将其转换为布尔值。

您可以重构您的代码,使其既分配值 使用满足 JSHint 的强制转换操作并使代码对 reader:

for (var e, i = 0; !!(e = formErrors[i]); i += 1)

第二个 !(直接在 (e... 前面的那个)导致转换为布尔值,但也否定它,第一个 ! 恢复这个否定。

这是一种非常奇怪的循环编写方式。 JsHint期望那里有一个布尔表达式("conditional"),并判断你的赋值是错误的,你实际上想要一个比较(==而不是=)。

你应该做的是切换到以下常见的数组迭代习惯用法:

for (var i = 0; i < formErrors.length; i += 1) {
    var e = formErrors[i];
    …

(对于不包含虚假值的非稀疏 formErrors 数组,其工作方式与原始代码相同。)

或者,如果您想编写非惯用代码,转储 jshint :-)