对JSHint选项如何工作感到困惑

时间:2012-12-16 16:27:20

标签: node.js jshint

问题

我制作了一个示例JavaScript文件来说明我的困惑。

(function() { console.log(true == true); })()

这应该会导致两个错误;首先使用==代替===,然后使用缺少的分号。但是,当我跑

var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');
节点REPL中的

在我不期望的时候我得到错误。我期望没有错误的原因是因为在JSHint文档中,它说:

  

第二个参数[to jshint]是控制选项的可选对象   JSHINT的操作。大多数选项都是布尔值:它们是   全部是可选的,默认值为false。

我希望这不会产生错误,因为我没有定义任何选项所以所有都应该是假的。意外行为的最后一部分是设置选项似乎什么都不做。以下两次对jshint的调用也会产生相同的错误:

var myFile = '(function() { console.log(true == true); })()';
jshint(myFile, {eqeqeq: false, asi: false});
jshint('/*jshint eqeqeq:false, asi:false */\n' + myFile);

问题

我不确定JSHint选项是如何工作的,我很可能会错误地解释文档。我很高兴知道上面的jshint或我的假设中的调用是不正确的,或者JSHint是否确实存在问题。

1 个答案:

答案 0 :(得分:6)

默认情况下并非所有选项都关闭。在我们的文档(http://www.jshint.com/docs/)中,您可以看到一些选项是“强制执行”和一些“放松”[1]。这意味着默认情况下会显示一些警告,您需要启用“放松”选项才能将其关闭。

现在,有了这些信息,让我们看看你的第二个问题:

/*jshint eqeqeq:false, asi:false */
(function () { console.log(true == true); })()

此代码将触发== true的不安全比较警告和缺少分号。你试图通过关闭两个选项eqeqeq和asi来解决这个问题。前者,当设置为true时,需要严格比较无处不在并默认关闭,因此您可以省略它。你得到一个警告,因为JSHint认为== true/false/0/null比较不安全,目前没有办法将其关闭(例如,a == b不会有警告)[2]。而后一个选项(asi)是一个放松的选项,所以你实际上需要打开它告诉JSHint可以容忍丢失的分号。因此,要使您的示例通过,您需要以这种方式更改它:

/*jshint asi:true */
(function () { console.log(true === true); }()

[1] - 我知道这很令人困惑。由于向后兼容性,我不能只改变选项的工作方式,但我正在努力减少它的混乱。我将尽快为每个选项添加默认值。

[2] - 即将推出的1.0.0版本允许您忽略其代码的任何警告,即使没有相应的命名选项。