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

Aar*_*ron 1 node.js jshint

问题

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

(function() { console.log(true == true); })()
Run Code Online (Sandbox Code Playgroud)

这应该会导致两个错误; 首先使用==代替===,而第二个是缺少分号.但是,当我跑

var jshint = require('jshint').JSHINT;
jshint('(function() { console.log(true == true); })()');
Run Code Online (Sandbox Code Playgroud)

在节点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);
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*yov 6

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

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

/*jshint eqeqeq:false, asi:false */
(function () { console.log(true == true); })()
Run Code Online (Sandbox Code Playgroud)

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

/*jshint asi:true */
(function () { console.log(true === true); }()
Run Code Online (Sandbox Code Playgroud)

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

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