開発者ブログ
HTML5資料室 » JSLint/JSHint

JSLint/JSHint

Last modified by fukudayasuo on 2013/07/31, 13:51

JSLintとは

JSLint

(JSLint.com - What is JSLint? を大まかに和訳しました。)

JSLintとは、対象のJavaScriptプログラムから問題となる箇所を検索するコード品質ツールです。
C言語が登場して間もない頃、コンパイラによって捕えることができなかったプログラムミスがあったため、ソースファイルを検証するためのツールとしてLintが開発されました。今ではC言語は成熟し、コンパイラがエラーを捕えて警告出来るようになったためLintは必要なくなりました。
JavaScriptも登場して比較的若い言語で、ウェブページ上で細かい処理を行うことを目的としていました。しかしJavaScriptは非常に有能な言語です。現在では大きなプロジェクトで使われていますがプロジェクトが複雑になると、言語を使いやすくすることを目的とした特徴の多くが厄介になるため、JavaScriptの為のLintが必要となります。
JSLintはJavaScript構文チェッカーとバリデーターをもち、ソースコードを検証します。問題を見つけると、該当するソースコードの場所と問題点をメッセージとして返します。頻繁にはありますが、警告された問題が必ずしも構文エラーというわけではありません。JSLintは形式や規約、構造的な問題をチェックします。
JSLintはECMASCriptプログラミング言語標準の第3版を、専門のサブセットとして定めています。JavaScriptコード規約に含まれている提言は、サブセットと関連しています。
JavaScriptはいいかげんででありながらも簡潔で美しい良い言語です。JSLintはプログラムのコード品質の向上を助けます。JSLintは、コードの品質によってはたとえブラウザで動いたとしても、結果不合格と判定します。JSLintが指摘した問題点に全て対応すべきです。
JSLintは、JavaScript、HTML、CSSまたはJSONテキストで使用することができます。

JSLintプラグインの使用方法

各種ツール・ライブラリ » JSLintプラグイン をご覧ください。

チェックルール一覧 - JSLint

JSLint独自の項目

オプション内容エラーメッセージ
safeADsafeルールのうち、ウィジェット向けのルール以外をチェックするかチェックする: true / チェックしない: falseADsafe violation: '・・・'.
adsafeADsafe のルールを適用するかfalseADsafe violation: '・・・'.
properties/*properties*/コメントを利用して全プロパティのスペルミスをチェックするかfalseUnexpected /*property*/ '・・・'.
css@charset 'UTF-8' の定義が無いCSSを許容する.false・Unexpected '・・・'.   ・Unrecognized style attribute '・・・'.
unparam未使用の変数の存在を許容する.false'・・・' was used before it was defined.
cap大文字のHTMLタグの使用を許容する.falseAttribute '・・・' not all lower case.
widgetYahoo Widget環境で提供されているグローバル変数・関数があらかじめ定義されていると仮定するかfalse'・・・' is not defined.
indent指定されたインデント幅かチェックする (0が指定された場合はチェックしない)4Expected '・・・' at column ・・・, not column ・・・.
varsfunction内に、複数のvarステートメントが定義されていることを許容する.trueCombine this with the previous 'var' statement.
fragmentHTMLのフラグメント識別子を許容する.falseADSAFE: Use the fragment option.
confusionある変数の型が途中で別の型変わることを許容する.trueType confusion: ・・・ and ・・・.
onHTMLでイベントハンドラの登録を許容する.falseAvoid HTML event handlers.
eqeq抽象比較( == または != ) の使用を許容する.trueExpected '・・・' and instead saw '・・・'.
sloppy'use strict'の使用を禁止する.trueMissing 'use strict' statement.
maxlenソースコード行数をチェックする(指定なし:全行) Line too long.
'continue'continueを許容する.trueUnexpected '・・・'.
windowsWindows固有のグローバル変数・関数の使用を許容する.false'・・・' is not defined.

windowsオプションがtrueの場合、以下のオブジェクトを使用していると警告します。
- ActiveXObject
- Cscript
- Debug
- Enumerator
- System
- VBArray
- Wscript
- WSH

JSHintと共通の項目

オプション内容
browserdocumentやwindow等、モダンブラウザ環境で存在するオブジェクトの使用を許容する.true
develalert、confirm、console、Debug、opera、promptを使用を許容する.false 
maxerr許容するエラーの最大数(指定なし:50個)1000
white不適切なインデントやスペースを許容する.true
es5ECMAScript5の文法を許容する.false
passfail1個目のエラーでチェックを停止する.false
debugdebuggerキーワードを許容する.false
sub配列表記でオブジェクトのプロパティへ参照することを許容する.true
bitwiseビット演算子の使用を禁止する.true
nomen名前の先頭または末尾でアンダーバーを禁止する.false
regexp正規表現の . (任意の1文字)と [^...] (指定した文字以外)を禁止する.false
forinhasOwnPropertyメソッドでチェックを行っていないfor-in文を禁止する.false
nodenode.jsで生成されるオブジェクトの使用を許容する.false
rhinoRhinoで生成されるオブジェクトの使用を許容する.false
undef宣言の無い変数または関数を禁止する.true
evileval関数を許容する.false
newcapコンストラクタの一文字目が小文字であることを禁止する.true
plusplusインクリメント(++)・デクリメント(--)を禁止する.false

JSHintとは

JSHintとは、JSHintと同様のコード検査ツールです。
JSLintとの違いは、JSLintより柔軟にオプションが設定出来る点と、JSLintでは未対応の検査もできる点です。

チェックルール一覧 - JSHint

Enforcing Options

オプション内容エラーメッセージ
bitwiseビット演算子が使用されているかチェックする: true / チェックしない: falseUnexpected use of '・・・'. 
curly中カッコでブロックされているかチェックする: true / チェックしない: falseExpected '{' and instead saw '・・・'.
eqeqeq厳密等価演算子(===, !==)を使用しているかチェックする: true / チェックしない: falseUse '===' to compare with 'null'.
 // ×
 if (a == null)
    console.log("curly");
 // 〇
 if (a === null) {
    console.log("curly");
 }
forinfor-inでオブジェクトを参照するする際、hasOwnProperty()を使用しているかチェックする: true / チェックしない: falseThe body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
 // ×
 for (var p in obj) {
    ~
 }
 // 〇
 for (var p in obj) {
    if (obj.hasOwnProperty(obj[p]) {
       // 継承されていないプロパティに対する処理
    }
 }
immed即時関数パターンが、カッコで囲われているかチェックする: true / チェックしない: false・Move the invocation into the parens that contain the function. ・Wrap an immediate function invocation in parentheses to assist the reader in understanding that the expression is the result of a function, and not the function itself.
// ×
(function() {
   
 })()

// 〇
((function() {
   
 })())
latedef変数を定義する前に呼び出しているかチェックする: true / チェックしない: false'・・・' was used before it was defined.
newcapコンストラクタ名の一文字目が大文字かチェックする: true / チェックしない: falseA constructor name should start with an uppercase letter.
noargarguments.caller と arguments.calleeの使用されているかチェックする: true / チェックしない: falseAvoid arguments.callee.
noempty処理が記述されていない空のブロックが存在するかチェックする: true / チェックしない: falseEmpty block.
 // ×
 if (a ==10) {}
 // 〇
 if (a == 10) {
    console.log("aaa");
 }
nonewnewキーワードが使用されているかチェックする: true / チェックしない: falseDo not use 'new' for side effects.
plusplus++ または -- が使用されているかチェックする: true / チェックしない: falseUnexpected use of '++'.
regexp正規表現に .(ドット)が使用されているかチェックする: true / チェックしない: falseInsecure '.'.
undef宣言の無い変数または関数が使用されているかチェックする: true / チェックしない: false'・・・' is not defined.
strict"use strict"が宣言されているかチェックする: true / チェックしない: falseMissing "use strict" statement.

Relaxing Options

asiセミコロンの未挿入を許容するか許容する: true / 許容しない: falseMissing semicolon.
bossifの条件/while・doの反復条件/forの終了条件で、変数へ代入する処理を許容するか許容する: true / 許容しない: falseExpected a conditional expression and instead saw an assignment.
debugdebuggerキーワードを許容するか許容する: true / 許容しない: falseAll 'debugger' statements should be removed.
eqnull == null または == undefinedを許容するか許容する: true / 許容しない: falseUse '===' to compare with '~'.
es5ECMAScript5の文法を許容するか許容する: true / 許容しない: falseUnexpected dangling 
evileval関数の使用を許容するか許容する: true / 許容しない: falseeval is evil.
expr宣言または関数呼び出しではなく、式として使用することを許容するか許容する: true / 許容しない: falseExpected an assignment or function call and instead saw an expression.
// 関数hogeが定義されている場合、関数を式として使用するとこの警告が出る  
function hoge() { }  
 hoge ? 1 : 0; // ×
 
// 以下のような場合は問題ない。  
if (hoge === undefined) // 〇
var a = hoge; // 〇
iterator__iterator__プロパティを許容するか許容する: true / 許容しない: false__iterator__' is only available in JavaScript 1.7.
lastsemicセミコロンが無い構文を許容するか許容する: true / 許容しない: falseMissing semicolon.
laxbreak安全でない改行を許容するか許容する: true / 許容しない: falseBad line breaking before '~'.
// パターンのひとつに、+の前に改行があると警告される。
"aaaa"
+ "bb";  // ×

"aaaa"+
"bb";     // 〇
loopfuncループ内で関数式を許容するか許容する: true / 許容しない: falseDon't make functions within a loop.
// ×
var nums = [];

for (var i = 0; i < 10; i++) {
   (function (i) {
      nums[i] = function (j) {
        return i + j;
      }
   }(i));
}

// 〇
var nums = [];

for (var i = 0; i < 10; i++) {
   nums[i] = function (j) {
     return i + j;
   };
}
nums[0](2);
// Prints 12 instead of 2
onecasecaseが一つしかないswitch文を許容するか許容する: true / 許容しない: falseThis 'switch' should be an 'if'.
proto__proto__の使用を許容するか許容する: true / 許容しない: falseThe '__proto__' property is deprecated.
regexdash正規表現の制御文で、角カッコ内の先頭または末尾にハイフン"-"の存在を許容する.許容する: true / 許容しない: falseUnescaped '-'.
scripturljavascript: で始まるURLを許容する.許容する: true / 許容しない: falseScript URL.
shadow同一スコープで、名前が重複している関数の定義を許容する.許容する: true / 許容しない: false'・・・' is already defined.
sub配列表記でオブジェクトのプロパティへアクセスすることを許容するか許容する: true / 許容しない: false['・・・'] is better written in dot notation.
window['navigator'] // ×
window.navigator // 〇
supernew変わったnew演算子の使い方を許容する許容する: true / 許容しない: falseWeird construction. Delete 
var func = new function() {} // ×
 
var func = function() {}
var hoge = new func();       // 〇
validthis非コンストラクタ関数内でthisの使用を許容する.許容する: true / 許容しない: falsePossible strict violation.
// 以下のようなコードの場合に指摘される

 (function () {
   "use strict";
   function say() {
      this.hello = 'world';
    }
    say();
 }());

Environments

browserdocumentやwindow等、モダンブラウザ環境で存在するオブジェクトの使用を許容するか許容する: true / 許容しない: false
couchCouchDBで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
develalert、confirm、console、Debug、opera、promptを使用を許容するか.許容する: true / 許容しない: false
dojoDojo Toolkitで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
jqueryjQueryで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
mootoolsmootoolsで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
nodenode.jsで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
nonstandardescape, unescape関数の使用を許容するか許容する: true / 許容しない: false
prototypejsprototype.jsで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
rhinoRhinoで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false
wshWindwos Scripting Hostで生成されるオブジェクトの使用を許容するか許容する: true / 許容しない: false

Legacy

nomen名前の先頭または末尾にアンダーバーが付いているオブジェクト名をチェックするかチェックする: true / チェックしない: falseUnexpected '・・・' in '・・・' 
onevar1つの関数で2つ以上のvarステートメントをチェックするか.チェックする: true / チェックしない: falseToo many var statements.
passfail1個目のエラーが見つかったときに、テストを停止するか.停止する: true / 停止しない: falseStopping
whiteコードスタイル(インデントや空白の配置について)が、JSLintの作者が提唱するスタイルと一致するかチェックする.チェックする: true / チェックしない: falseUnexpected space after

JSHintが必ずチェックする項目

同一行のインデントに、TABとスペースが混在しているMixed spaces and tabs.
内部関数が先頭で定義されていないInner functions should be listed at the top of the outer function.

Copyright (C) 2012-2017 NS Solutions Corporation, All Rights Reserved.