【发布时间】:2015-10-22 07:27:46
【问题描述】:
我很清楚类似的问题,但我仍然无法根据这些问题解决我的问题。
所以,我的代码如下所示:
for (var e, i = 0; e = formErrors[i]; i += 1)
JSHint 在 char 39 中返回所述错误,因此在 formErrors[i] 之后使用 ;。我能做什么?
【问题讨论】:
标签: javascript for-loop jshint
我很清楚类似的问题,但我仍然无法根据这些问题解决我的问题。
所以,我的代码如下所示:
for (var e, i = 0; e = formErrors[i]; i += 1)
JSHint 在 char 39 中返回所述错误,因此在 formErrors[i] 之后使用 ;。我能做什么?
【问题讨论】:
标签: javascript for-loop jshint
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 == !…。然后点赞
true == !!(..),还是很丑...
Boolean(e = formErrors[i]) 将是一个替代方案,但请停止将布尔值与布尔值进行比较。
=== to compare with false”和“混淆使用!”(只是什么我是说 :-)),而 !! 和 Boolean 都有效。
这只是编写循环的一种非常奇怪的方式。 JsHint 期望那里有一个布尔表达式(“条件”),并判断您的分配是一个错误,而您实际上想要一个比较(== 而不是=)。
你应该做的是切换到以下常见的数组迭代习语:
for (var i = 0; i < formErrors.length; i += 1) {
var e = formErrors[i];
…
(对于不包含虚假值的非稀疏 formErrors 数组,其工作方式与您的原始代码相同。)
或者,如果您想编写非惯用代码,请转储 jshint :-)
【讨论】:
forErrors[i] == false 循环将结束,但不是在您的版本中。
e = formErrors[i] 是一个赋值,你不想要一个条件吗?在这种情况下,在 i=0 后使用逗号,否则在分号后添加条件。
【讨论】:
通常,for 循环中的中间元素是用于决定是否继续循环的条件。你在那里有一个任务,如果你想要一个条件,你应该使用e === formErrors[i](或使用双精度=,但通常不建议这样做)。
从技术上讲,赋值可以工作,因为 e 可以是,例如,某个对象 (true) 或 null (false)。但这通常被认为是糟糕的编码风格,并且不会产生非常可读的代码。
【讨论】: