我应该使用JSLint还是JSHint JavaScript验证?[关闭]


454

我目前正在针对JSLint验证我的JavaScript并取得进展,它正在帮助我编写更好的JavaScript,尤其是在使用Jquery库时。

现在我所遇到JSHint,一个叉的JSLint
因此,我想知道对于Web应用程序来说,很大程度上是JavaScript驱动的,它是可用于以下工作的更好或最适用的验证工具:

  • JSLint还是JSHint?

我现在想确定一种验证机制并继续前进,将其用于客户端验证。

和jshint和jslint之间的区别?请在单个javascript示例中说明。

链接:

  1. jshint - http://www.jshint.com/

  2. jslint - http://jslint.com/


4
ESLint怎么?尽管不完美:Combine this with the previous 'var' statement-> Do not mix 'require' and other declarations,自相矛盾。
nyuszika7h 2014年



不是JS开发人员。但是我发现JSHint在我们的代码审查过程中非常有用。我推荐它。
Chetan Vashistt​​h,

Answers:


156

[编辑]
此答案已被编辑。我将下面的原始答案留给上下文(否则,注释将没有意义)。

最初提出此问题时,JSLint是JavaScript的主要整理工具。JSHint是JSLint的新分支,但尚未与原始版本相去甚远。

从那以后,JSLint几乎保持静态,而JSHint进行了很大的更改-它抛弃了JSLint的许多对立规则,增加了新规则的整体负载,并且通常变得更加灵活。此外,现在可以使用另一个工具ESLint,它更加灵活并且具有更多规则选项。

在我最初的回答中,我说过您不应该强迫自己遵守JSLint的规则;只要您了解它为什么会发出警告,就可以自己判断是否更改代码以解决警告。

从2011年开始使用JSLint的超严格规则集,这是合理的建议-我看到很少有JavaScript代码集可以通过JSLint测试。但是,利用当今的JSHint和ESLint工具中可用的更为实用的规则,尝试使您的代码以零警告通过它们是更现实的主张。

有时候,棉短绒有时仍会抱怨您故意做的事情-例如,您知道应该始终使用,===但只有这一次您才有充分的理由使用==。但是即使那样,使用ESLint,您也可以选择eslint-disable在有问题的行周围进行指定,这样您仍然可以通过带有零警告的lint测试,而其余代码则遵循该规则。(只是不要经常做这种事情!)


[原始答案]

一定要使用JSLint。但是不要迷恋结果,也不去解决它警告的所有问题。这将帮助您改进代码,并帮助您发现潜在的错误,但并非JSLint抱怨的所有内容都是一个真正的问题,因此不必觉得您必须使用零警告来完成该过程。

不管写得多么好,几乎任何长度或复杂性都很高的Javascript代码都会在JSLint中产生警告。如果您不相信我,请尝试通过它运行一些流行的库,例如JQuery。

一些JSLint警告比其他警告更有价值:了解要注意的警告和不那么重要的警告。应该考虑每一个警告,但是不必为了解决任何给定的警告而修改代码。查看代码并决定对它满意是完全可以的。有时候,JSlint不喜欢的事情实际上是正确的事情。


3
jsHint最好的部分是它具有用于接受jQuery的标志,并且不会像jslint那样令人讨厌/严格。例如:在可以的地方for (i = 0; i < dontEnumsLength; i++)Unexpected '++'。等
RaphaelDDL

2
请不要忽略规则,这是您可以用短绒棉做的最坏的事情。只需对其进行设置,否则,请进行更改。JSHint和JSCS的组合太棒了
AuthorProxy

JSHint说“期望分配或函数调用,而是看到一个表达式。” 到仅用于操作的三元组。Mozilla文档:说:“您还可以在可用空间中使用三元求值,以执行不同的操作”。developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference / ... @AuthorProxy我打算使用Mozilla并忽略JSHint。抱歉。
2015年

1
到目前为止,ESLint以及airbnb之类的流行配置似乎是整个行业的发展方向。
jinglesthula

369

tl; dr外卖

如果您正在为自己或团队寻求非常高的标准,请使用JSLint。但这不一定是THE标准,而仅仅是A标准,其中一些标准是由一个名叫Doug Crockford的Java语言神学的。如果您想变得更加灵活,或者您的团队中有一些老专业人士不接受JSLint的意见,或者定期在JS和其他C系列语言之间来回走动,请尝试JSHint。

长版

分叉背后的原因很好地解释了为什么JSHint存在:

http://badassjs.com/post/3364925033/jshint-an-community-driven-fork-of-jslint http://anton.kovalyov.net/2011/02/20/why-i-forked-jslint-to -jshint /

所以我想这是“社区驱动”而不是克罗克福德驱动。实际上,对于一些JSLint坚持的风格和次要语法“意见”,JSHint通常比较宽容(或至少可配置或不可知)。

举例来说,如果您认为下面的A和B都很好,或者您想编写具有B中不可用的A的一个或多个方面的代码,那么JSHint适合您。如果您认为B是唯一正确的选择,请选择... JSLint。我敢肯定还有其他差异,但这突出了一些。

A)开箱即用地传递JSHint-JSLint失败

(function() {
  "use strict";
  var x=0, y=2;
  function add(val1, val2){
    return val1 + val2;
  }
  var z;
  for (var i=0; i<2; i++){
    z = add(y, x+i);
  }
})();

B)同时通过JSHint和JSLint

(function () {
    "use strict";
    var x = 0, y = 2, i, z;
    function add(val1, val2) {
       return val1 + val2;
    }
    for (i = 0; i < 2; i += 1) {
        z = add(y, x + i);
    }
}());

我个人觉得JSLint代码非常好看,而我不同意的唯一难点是,它讨厌函数中的多个var声明和for循环var i = 0声明,以及某些函数声明的空白实施。

我发现JSLint强制执行的一些空白操作并不一定很糟糕,但是与该系列中其他语言(C,Java,Python等)的一些相当标准的空白约定不同步。也遵循Javascript中的约定。由于我整天都在使用多种语言编写文字,并且与不喜欢Lint样式空白的团队成员一起工作,因此我发现JSHint是一个很好的平衡点。它捕获的东西是合法的错误或形式很糟糕,但是却不象JSLint那样(有时,以我无法禁用的方式)对我不屑一顾,我不关心它们。

许多好的库不是Lint'able的,对我来说,这表明某些JSLint只是推送1版“好的代码”(实际上是好的代码)是有道理的。但是再说一次,同样的库(或其他好的库)也可能不可用,因此,touché。


11
...我必须承认,我对最近看到的关于JS(顺便说一下,也包括CSS)的编码样式的专业意见感到失望,这让我感到失望。似乎对特定语言的痴迷已经超越了非专业从业者(即目标受众)的需求。考虑到他们需要好的建议,这真是太可惜了,他们会盲目地跟进并永久保留被吹捧为最佳实践的任何东西,而不会有所了解。通常,它与更成熟的用户社区针对其他语言采用的其他标准不兼容。:(
Lee Kowalkowski

67
@LeeKowalkowski JSLint不鼓励的原因for (var i = 0; ...; i++)是因为它不会使循环独立。功能的范围i。该语法看起来像是在创建块作用域,但事实并非如此,这会使经验不足的JavaScript程序员和使用多种语言编写的人们误解了变量的作用域,并可能导致细微的错误。我们中的许多人(包括我本人)可能不喜欢将所有声明放在首位的样子,但这很好地提醒了JavaScript没有块范围。
马克·埃文斯

25
@MarkEvans从观点来看,这是自成一体的,如果您将循环仅移至另一个函数,i则不会意外变为全局。i函数作用域而不是块作用域的事实不足以在顶部声明变量,这是一个足够好的理由,应始终将变量声明为尽可能靠近它们的使用位置(programmers.stackexchange.com/questions/56585/…)。
Lee Kowalkowski

17
@MarkEvans我认为您过多地关注语言实现细节。编程标准应该针对人类,而不是针对编译器。依靠静态代码分析工具来捕获常见的陷阱并不能替代采取首先避免它们的良好习惯。我无法理解为什么应将简单循环的迭代器变量声明为与需要它的循环有任何距离的原因。许多其他语言的编码标准都说,为了易于阅读,声明变量时应尽可能靠近变量的使用位置。我没有看到没有在JS中执行此操作的充分理由。
Lee Kowalkowski

11
在循环之外使用迭代器变量是linter应该检查的事情。
Lee Kowalkowski

61

在javascript linting前端还有一个成熟且积极开发的 “播放器”- ESLint

ESLint是用于识别和报告ECMAScript / JavaScript代码中的模式的工具。在许多方面,它与JSLint和JSHint相似,但有一些例外:

  • ESLint使用Esprima进行JavaScript解析。
  • ESLint使用AST评估代码中的模式。
  • ESLint完全可插入,每个规则都是一个插件,您可以在运行时添加更多内容。

真正重要的是它可以通过自定义插件/规则扩展。已经有多个针对不同目的编写的插件。除其他外,还有:

当然,您可以使用自己选择的构建工具来运行ESLint


1
键入时拥有在编辑器中运行的linter的价值不可低估。ESLint以这种方式被广泛使用。我从未听说过JSLint或JSHint编辑器支持(1个轶事数据点)。
jinglesthula

17

几周前我遇到了同样的问题,并且正在评估JSLint和JSHint。

与这个问题的答案相反,我的结论不是:

一定要使用JSLint。

要么:

如果您正在为自己或团队寻求非常高的标准,请使用JSLint。

因为您可以在JSHint中配置与在JSLint中几乎相同的规则。因此,我认为可以实现的规则没有太大差异。

因此,选择一个以上的原因更多是政治上的而不是技术上的。

由于以下原因,我们最终决定选择JSHint:

  • 似乎比JSLint更可配置。
  • 看起来绝对是由社区推动,而不是单人秀(无论《男人》有多酷)。
  • JSHint比我们的JSLint更适合我们的代码风格OOTB。

1
感谢您的简短回答。这解决了我对此问题的空白。
akauppi

13

我会提出第三个建议,即Google Closure编译器(以及Closure Linter)。您可以在这里在线尝试。

Closure Compiler是使JavaScript下载和运行速度更快的工具。这是一个真正的JavaScript编译器。它不是从源语言编译为机器代码,而是从JavaScript编译为更好的JavaScript。它解析您的JavaScript,对其进行分析,删除无效代码,然后重写并最大程度地减少剩余内容。它还会检查语法,变量引用和类型,并警告常见的JavaScript陷阱。


4
Closure Compiler会提取出Lint没有的东西吗?
詹姆斯·麦克马洪

4
我肯定没有看到该工具发出的单个警告。JSLint和JSHint对相同的输入产生太多警告,以致它们都给出“太多错误”。
wallyk 2012年

6
我们在最近的项目上使用了闭包,因此不再做。不能将linter配置为进行某些检查(其中许多是您不关心的事情),并且仅当您仅使用封闭友好的库(其中实际上没有这种方法)时,编译器才会真正获得回报Google以外的任何网站)。
罗伯特·利维

4
这并不是指Google Closure Comepiler本身,而是Google的工具应始终看待事物。它们是为解决特定Google的目标而构建的,它们可能与您的目标不一致。
Pacerier,2015年

@RobertLevy感谢您对您的经历发表评论...我正在阅读javascript的Google样式指南,它建议使用Closure-compiler作为它的皮棉程序。但现在我看到有其他类似的JSLint和jshint
特雷弗·博伊德·史密斯

13

前言:嗯,那很快就升级了。但是决定要坚持下去。希望这个答案对您和其他读者有帮助。

我有点被这里带走

代码提示

尽管JSLint和JSHint是很好的工具,但多年来,我逐渐欣赏了我的朋友@ugly_syntax所说的:

设计空间较小

这是一个总的原则,很像“和尚”,它限制了人们必须做出的选择,可以提高生产力和创造力。

因此,我目前最喜欢的零配置JS代码样式:

StandardJS

更新

流量改善了很多。有了它,您可以使用JS添加类型,这将帮助您防止很多错误。但是它也可能会挡住您的出路,例如在连接无类型JS时。试试看!

快速入门/ TL; DR

添加standard为项目的依赖项

npm install --save standard

然后在中package.json,添加以下测试脚本:

"scripts": {
    "test": "node_modules/.bin/standard && echo put further tests here"
},

在开发过程中获得时髦的输出,而npm install --global snazzy不是运行它npm test

注意:类型检查与启发式

我的朋友在提到设计空间时提到Elm,我鼓励您尝试一下该语言。

为什么?JS实际上是受LISP启发的,LISP是一类特殊的语言,碰巧是未类型化的。诸如Elm或Purescript之类的语言是类型化的功能编程语言。

类型限制了您的自由,以便编译器在最终违反语言或您自己的程序规则时能够检查并指导您;不管程序的大小(LOC)。

最近,我们有一个初级同事实现了两次响应式接口:一次是在Elm中,一次是在React中;看一下我在说什么。

比较Main.elm(输入)⇔ index.js(未输入,无测试)

(请注意,React代码不是惯用的,可以改进)

最后一句话,

现实是JS 无类型的。我应该向谁建议打字编程

看到,使用JS,我们处在不同的领域:从类型中解放出来,我们可以轻松地表达很难或不可能赋予适当类型的东西(这当然是一个优势)。

但是,如果没有类型,几乎没有什么可以检查我们的程序,因此我们被迫引入测试和(较小程度地扩展)代码样式。

我建议您看一下LISP(例如ClojureScript)以获取启发,并投资测试代码。阅读子堆栈的方法以获取想法。

和平。


为什么要下票?我当然不介意,但是既然OP写了“它正在帮助我编写更好的JavaScript”,我认为这是一个有用的答案吗?你怎么看?
连线

1
与下降投票无关,但您的Main.elm和index.js链接均为
404s

1
问题显然是jslint或jshint,而不是要求替代方法。
jzacharuk

1
gif值得赞扬。
sr9yar

8

好吧,除了进行手动的lint设置外,我们还可以在JS文件本身的顶部包括所有lint设置,例如

声明该文件中的所有全局变量,例如:

/*global require,dojo,dojoConfig,alert */

声明所有的皮棉设置,例如:

/*jslint browser:true,sloppy:true,nomen:true,unparam:true,plusplus:true,indent:4 */

希望这能够帮到你 :)


1

还有另一个积极开发的替代方案-JSCS — JavaScript代码样式

JSCS是用于以编程方式强制执行样式指南的代码样式库。您可以使用150多种验证规则为项目详细配置JSCS,其中包括来自流行样式指南(如jQuery,Airbnb,Google等)的预设。

它带有多个预设,您可以通过简单地preset.jscsrc配置文件中指定并对其进行自定义来进行选择-覆盖,启用或禁用任何规则:

{
    "preset": "jquery",
    "requireCurlyBraces": null
}

也有为流行的编辑器构建的插件和扩展。

另请参阅:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.