【问题标题】:JSHint -Expected a conditional expression and instead saw an assignmentJSHint - 期望一个条件表达式,而是看到一个赋值
【发布时间】: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


    【解决方案1】:

    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 想了想,也觉得很丑...想true == !!(..),还是很丑...
    • 不,这不是丑陋,而是a common js idiom。如果您不喜欢它,Boolean(e = formErrors[i]) 将是一个替代方案,但请停止将布尔值与布尔值进行比较。
    • @Bergi - 你确定这足以满足 JSHint 吗?
    • 我没有尝试过,但确实期望它。编辑:when I did,您的版本实际上警告“Use === to compare with false”和“混淆使用!”(只是什么我是说 :-)),而 !!Boolean 都有效。
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 这不是相同的逻辑。 if forErrors[i] == false 循环将结束,但不是在您的版本中。
    • @Amit:是的,不是,但我认为 OP 的实际意思是这样。请参阅我在 sn-p 下方的免责声明 :-)
    • 啊!太小而无法注意到 ;-)
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-09
        • 2019-04-22
        • 2020-02-12
        • 2019-10-15
        • 2020-11-08
        相关资源
        最近更新 更多