JSHint - 预期条件表达式,而看到的是一个赋值语句。

5
我很清楚有类似的问题,但基于那些问题,我仍无法解决我的问题。
因此,我的代码看起来像这样:
for (var e, i = 0; e = formErrors[i]; i += 1)

JSHint 在第39个字符处返回了错误信息,因此在 formErrors[i] 后加上 ;。我该怎么办?
4个回答

10

JSHint警告您可能存在潜在的错误。通常情况下,for语句的第二部分应该是一个布尔表达式,您可以使用比较运算符(如=====!=>等)。由于表达式是 e = formErrors[i],看起来可能是一个错误,可能是由于缺少等号造成的。这是一种常见的拼写错误,会导致很多错误。

显然,在这种情况下,这不是一个错误,而是一种有意的用法:任何表达式都会被求值为某个值,而赋值表达式会被求值为所赋的值:

var x;

alert(x = 1);

所以for语句实际上会给e赋一个新的值,但也会将该值作为条件进行评估,如果需要,则转换为布尔值。你可以重构你的代码,使它既分配值使用强制类型转换操作,这将满足JSHint并使代码对读者更加明显。
for (var e, i = 0; !!(e = formErrors[i]); i += 1)

第二个 !(直接位于(e...前面的那个)会将其转换为布尔值,但也会对其进行取反,第一个 ! 反转这个取反操作。

最好使用 !!(e = formeErrors[i]) 而不是那个丑陋的 false == !…。然后就可以得到一个赞了。 - Bergi
@Bergi考虑了一下,也觉得很丑...想到true == !!(..),但还是很丑... - Amit
不,那并不丑陋,而是一种常见的JS习惯用法。如果你不喜欢它,Boolean(e = formErrors[i])是一个替代方案,但请停止将布尔值与布尔值进行比较。 - Bergi
@Bergi - 你确定这样就足以满足 JSHint 的要求了吗? - Amit
我之前没有尝试过,但是我确实期望它会这样做。编辑:当我使用jshint时,你的版本实际上警告说“使用===false进行比较”,以及关于“混淆使用!”(正如我所说的:-)),而!!Boolean都可以工作。 - Bergi
显示剩余3条评论

2

这只是一种非常奇怪的编写循环方式。JsHint 期望在那里有一个布尔表达式(“条件”),并判断您的赋值是一个错误,实际上您想要进行比较(使用==而不是=)。

您应该切换到以下常见的数组迭代成语:

for (var i = 0; i < formErrors.length; i += 1) {
    var e = formErrors[i];
(对于不包含任何假值的非稀疏formErrors数组,它与您的原始代码的作用相同。)

或者,如果您想编写非成语化的代码,可以放弃 jshint :-)


那不是相同的逻辑。如果 forErrors[i] == false 循环将会结束,但在你的版本中不会。 - Amit
@Amit:是的,它不是,但我认为这就是OP实际想表达的意思。请看我在代码片段下面的免责声明 :-) - Bergi
啊!太小了,没注意到;-) - Amit

0

e = formErrors[i] 是一个赋值语句,你不想在那里加一个条件吗?如果是这样,在 i=0 后面使用逗号,否则在分号后面加上条件。


0
通常,for循环中的中间元素是用于决定是否继续循环的条件。如果您想要一个条件,您应该使用e === formErrors[i](或者使用双=,但这通常不被推荐)。
技术上讲,赋值可以起作用,因为e可以是某个对象(true)或null(false)。但这被认为是不好的编码风格,通常不会产生非常可读的代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接