【问题标题】:Why does jshint not recognize an assignment as an expression?为什么 jshint 不能将赋值识别为表达式?
【发布时间】:2011-12-27 20:02:26
【问题描述】:

我需要如何修改这些行以使 jshint 满意?

赋值是一个表达式。为什么 jshint 不明白这一点?显然解释器会这样做。

Line 572: while(bookmark_element=bookmark_list[iterator++])

Expected a conditional expression and instead saw an assignment.


Line 582: while(bookmark_element=bookmark_list[iterator++])

Expected a conditional expression and instead saw an assignment.


Line 623: while(element_iterator=element_iterator.nextSibling)

Expected a conditional expression and instead saw an assignment.

【问题讨论】:

    标签: javascript jshint


    【解决方案1】:

    如果你真的想听 JSHint,将表达式转换为布尔值:

    while (!!(bookmark_element=bookmark_list[iterator++]))
    
    ! means: Something that evaluates to true is converted to false,
             something that evaluates to false is converted to true.
    

    所以,!! 的意思是:将某些东西转换为条件表示。

    【讨论】:

    • 最简单的..所以我选择了这个。
    • javascipt 是否有某种类型的 bool 类型的强制转换...更直接一些?
    • @stack.user.0 比!! 更直接?这是最直接的:JavaScript 有真/假,如果你想要一个实际的布尔值,!! 是你最简单的选择。
    • 您实际上不需要在这里转换为布尔值。在赋值周围添加额外的括号足以让 jshint 将其识别为表达式。因此,在上面的答案中,您可以删除 !!并且警告仍然静音
    【解决方案2】:
    /*jshint boss:true */
    

    使用options 进行实验。

    【讨论】:

      【解决方案3】:

      我确信 jshint 可以很好地理解这个表达式,只是大多数写 if (a = b) 的人实际上是指 if (a == b),所以这会产生一个警告。

      由于您的代码是您想要的,您可以添加一个显式测试:

      while ((element_iterator = element_iterator.nextSibling) !== null) { ... }
      

      【讨论】:

        【解决方案4】:

        报错至少有两种解决方法,根据JSHint docs.

        1. 在条件语句前添加/*jshint boss:true */
        2. 将语句括在额外的括号中,即while ((element_iterator = element_iterator.nextSibling)) {...}

        就个人而言,我认为用额外的括号括起来是最佳做法,因为它可以保持错误检查,但在代码方面仍然很有意义。在之前添加!! 实际上什么也没做,只是将表达式来回转换为真/假两次。

        【讨论】:

        【解决方案5】:

        这是一个表达式,你可以像这样修改它以使用 JSHint(虽然它不是很好):

        while(element_iterator.nextSibling) {
            element_iterator = element_iterator.nextSibling;
        

        对于你的最后一个例子。但是,您不需要这样做。 JSHint 只是一种帮助您改善编码习惯和纠正错误的工具,但鉴于您所拥有的内容清晰、简洁,并且(在我看来)是最好的方式 - 请忽略这些消息。

        【讨论】:

          【解决方案6】:

          jshint 无法判断您是否真的打算在条件块中进行分配,或者这是否真的应该是一个比较。担心的是其他人可能有同样的疑问。

          在迭代器的情况下,我认为你没问题。

          【讨论】:

            【解决方案7】:

            我遇到了这个错误,因为我在函数前面的声明中有一个尾随逗号:

            this.foo = "bar",   // <- Error was here
            
            this.myfunc = function() {
               ...   // <- Error reported on this line
            };
            

            (很难找到,但强化了我的观点,即 linter 通常是正确的,这是我的代码错误。如果我在全局范围内禁用了警告 - 甚至在那个地方 - 错误仍然会存在.&lt;/lecture&gt;)

            【讨论】:

            • 这与此问题中的警告不同。这是W030,问题是关于W084。虽然相似,但这在这里无关紧要。
            【解决方案8】:

            在您的 Javascript 文件中添加 /* jshint expr: true */ 注释,它将不再显示警告。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2018-10-22
              • 1970-01-01
              • 1970-01-01
              • 2018-10-09
              • 2018-04-20
              • 1970-01-01
              相关资源
              最近更新 更多