为什么jshint不能将赋值识别为表达式?

19

我需要如何修改这些代码才能让 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.
8个回答

20

如果你真的想听从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.
所以,!! 的意思是:将某个东西转换为条件表示形式。

最简单的方式...所以我选择了这个。 - user656925
JavaScript有类似于布尔类型的强制转换吗?或者有更直接的方法吗? - user656925
@stack.user.0 比 !! 更直接的方式?那就是最直接的了:JavaScript 有真值/假值,如果你想要一个实际的布尔值,!! 是最简单的选择。 - Dave Newton
17
这里实际上不需要转换为Boolean类型。在赋值周围添加额外的括号就足够让jshint将其识别为表达式。因此,在上面的答案中,可以删除!!,警告仍然会被消除。 - Charlie Martin

19
/*jshint boss:true */

尝试使用选项进行实验。


13

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

既然你的代码就是你想要的,你可以添加一个显式测试:

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

4
根据JSHint文档,至少有两种方法可以解决报告的错误。
  1. 在条件语句之前添加/*jshint boss:true */
  2. 将语句用额外的括号括起来,即while ((element_iterator = element_iterator.nextSibling)) {...}
个人认为使用额外的括号是最佳实践,因为它保持了错误检查,同时使代码易于理解。在表达式之前添加!!实际上没有任何作用,只会多次将表达式转换为true/false。

然而,值得注意的是,在for循环的情况下,“变量遮蔽”警告尤为重要。参考:http://jshint.com/docs/options/#shadow - Ye Shiqing

0

这是一个表达式,你可以修改它以使其与JSHint(虽然不太好)一起工作,方法如下:

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

针对您的最后一个例子,您其实不需要进行任何更改。JSHint 只是一种辅助工具,旨在帮助您提高编码习惯并纠正错误。但如果您的代码已经明确、简洁,并且(在我的看法中)是最佳实践,那么就可以忽略这些提示信息。


0
我遇到了这个错误,因为在函数之前的声明中有一个尾随逗号:
this.foo = "bar",   // <- Error was here

this.myfunc = function() {
   ...   // <- Error reported on this line
};

(找到它很困难,但这加强了我对代码检查工具通常是正确的观点,问题出在我的代码上。即使我全局禁用了警告,或者仅在那个地方禁用了警告,这个错误仍然存在。</lecture>


这不是与此问题相同的警告。这是W030,而该问题涉及W084。虽然相似,但在这里无关紧要。 - Emile Bergeron

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

0

jshint无法确定您是否真的打算在条件块中进行赋值,还是那实际上应该是一个比较。问题在于其他人可能会有同样的疑问。

对于迭代器,我认为您没问题。


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