对JSHint选项的工作方式感到困惑



问题

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

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

这应该会引发两个错误;首先是使用==而不是===,其次是缺少分号。然而,当我运行时

var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');

在Node REPL中,我在不希望出现错误的时候会出现错误。我希望没有错误的原因是因为在JSHint文档中,它说:

第二个参数[to jshint]是控制JSHINT的操作。大多数选项都是布尔值:所有选项都是可选的,并且默认值为false。

我希望这不会产生错误,因为我没有定义任何选项,所以所有选项都应该为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是否真的有问题。

并非所有选项在默认情况下都处于关闭状态。在我们的文档中(http://www.jshint.com/docs/)您可以看到,有些选项是"强制"的,有些选项则是"放松"的[1]。这意味着一些警告将默认显示,您需要启用"放松"选项来关闭它们

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

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

此代码将触发== true和缺少分号的不安全比较警告。您试图通过关闭两个选项eqeq和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版本将允许您忽略代码中的任何警告,即使没有相应的命名选项。

最新更新