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

时间:2015-10-22 07:27:47

标签: javascript for-loop jshint

我很清楚类似的问题,但我仍然无法以此为基础解决我的问题。

所以,我的代码看起来像这样:

Pporders::with(['product' => function($q) use($id) {
    $q->where('user_id', $id);
}])->get();

JSHint在char 39中返回错误,因此在for (var e, i = 0; e = formErrors[i]; i += 1) 之后使用;。我该怎么办?

5 个答案:

答案 0 :(得分:6)

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

显然,在这种情况下,它不是一个错误,而是故意使用任何experssion评估某事的事实,并且赋值表达式evalutaes到指定的值:



var x;

alert(x = 1);




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

你可以重构你的代码,使它分配值使用一个满足JSHint的转换操作,并使代码对读者更明显:

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

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

答案 1 :(得分:2)

这只是编写循环的一种非常奇怪的方式。 JsHint需要一个布尔表达式("条件"),并判断你的作业是错误的,你实际上想要进行比较(==而不是=)。

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

多德!你错过了一两个等号:

此:

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

或者

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

虽然我相信'e'总是未定义,所以'for'将循环遍历数组,而formErrors [i]未定义。

答案 4 :(得分:0)

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

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