web-dev-qa-db-ja.com

JSLintは「===」を予期していましたが、代わりに「==」を見ました

最近、このエラーを見つけたときに、JSLintを介してコードの一部を実行していました。このエラーについて面白いと思うのは、すべての==が===であると自動的に仮定することです。

それは本当に理にかなっていますか?型を比較したくない多くのインスタンスを見ることができましたが、これが実際に問題を引き起こす可能性があることを心配しています。

「期待される」という言葉は、これが毎回行われるべきであることを意味します.....それは私にとって意味をなさないものです。

81
Metropolis

IMO、盲目的に===を使用して、理解方法型変換の動作を試みても意味がありません。

Equals演算子==に関する主なfearは、比較される型に応じた比較規則により、演算子が非推移的になる可能性があることです。 、次の場合:

A == B AND
B == C

本当に保証するものではありません:

A == C

例えば:

'0' == 0;   // true
 0  == '';  // true
'0' == '';  // false

同じタイプの値を比較する場合、厳密な等しい演算子===は実際には必要ありません。最も一般的な例は次のとおりです。

if (typeof foo == "function") {
  //..
}

typeof演算子の結果を比較します。これは常に astringとastringリテラル...

または、型強制ルールがわかっている場合、たとえば、何かがnullまたはundefinedsomethingであるかどうかを確認します。

if (foo == null) {
  // foo is null or undefined
}

// Vs. the following non-sense version:

if (foo === null || typeof foo === "undefined") {
  // foo is null or undefined
}
122
CMS

JSLintは、Javascript構文が許可するよりも本質的に防御的です。

JSLintドキュメントから:

==および!=演算子は、比較する前に型強制を行います。これは、' \t\r\n' == 0 真であります。これにより、タイプエラーをマスクできます。

次の値のいずれかと比較する場合は、===または!==演算子(型強制を行わない):0 '' undefined null false true

値がtruthyまたはfalsyのみであることに注意する場合は、短い形式を使用します。の代わりに

(foo != 0)

言うだけ

(foo)

代わりに

(foo == 0)

いう

(!foo)

===および!==演算子が推奨されます。

25

JSLintは、JavaScriptがどれほど優れているべきかという考えを1人の人間に強制することに留意してください。提案されている変更を実装するときは、依然として常識を使用する必要があります。

一般に、型と値を比較するとコードが安全になります(型変換が期待どおりに動作しない場合、予期しない動作に陥ることはありません)。

17
Justin Niessner

トリプルイコールはダブルイコールとは異なります。これは、両サイドが同じ値であるかどうかのチェックに加えて、トリプルイコールはそれらが同じデータ型であることもチェックするためです。

そう ("4" == 4)は真ですが、("4" === 4)はfalseです。

JavaScriptは答えを出す前に型変換を行う時間を浪費する必要がないため、トリプルイコールも少し速く動作します。

JSLintは、あいまいなバグを減らすことを目的として、JavaScriptコードをできる限り厳密にすることを意図しています。データ型を尊重するように強制する方法でコードを作成できるようにするために、この種のことを強調しています。

しかし、JSLintの良い点は、それが単なるガイドであることです。サイトで彼らが言うように、たとえあなたが非常に優れたJavaScriptプログラマーであっても、それはあなたの感情を傷つけます。しかし、そのアドバイスに従う義務を感じるべきではありません。言っていることを読んで理解しているが、コードが壊れないことを確信しているなら、何かを変更することはあなたに強制されません。

JSLintに、何もしないという警告で攻撃されたくない場合は、チェックのカテゴリを無視するように指示することもできます。

12
Spudley

http://javascript.crockford.com/code.html からの引用:

===および!==演算子。

ほとんどの場合、===および!==演算子を使用することをお勧めします。 ==および!=演算子は型強制を行います。特に、偽の値と比較するために==を使用しないでください。

JSLintは非常に厳密であり、「webjslint.js」は独自の検証にも合格しません。

8
Lekensteyn

この質問を説明し、NetBeans(from)7.3がこの警告を表示し始めた理由を説明するために、これは誰かがこれをバグとして報告したときのNetBeansバグトラッカーの応答からの抜粋です。

JavaScriptでは==ではなく===を使用することをお勧めします。

==および!=演算子は、比較する前に型強制を行います。 '\ t\r\n' == 0が真になるため、これは悪いです。これにより、タイプエラーをマスクできます。 JSLintは==が正しく使用されているかどうかを確実に判別できないため、==および!=を使用せず、代わりにより信頼性の高い===および!==演算子を常に使用することをお勧めします。

参照

3
EM-Creations

偽造をテストする場合。 JSLintは許可しません

if (foo == null)

しかし、許可します

if (!foo)
3
nano2nd

まあそれは本当に問題を引き起こすことはできません、それはあなたにアドバイスを与えているだけです。それを取るか、それを残す。とはいえ、どれほど賢いかはわかりません。問題としてそれを提示しない文脈があるかもしれません。

2
Rushyo