93

最近、このエラーが発生したときに、JSLint を介してコードの一部を実行していました。私がこのエラーについておかしいと思うのは、すべての == が === であるべきだと自動的に想定することです。

それは本当に意味がありますか?型を比較したくないという例が多く見られましたが、これが実際に問題を引き起こす可能性があるのではないかと心配しています。

「期待される」という言葉は、これが毎回行われるべきであることを意味します.....それは私には意味がありません.

4

8 に答える 8

132

IMO、型変換がどのように機能するかを理解===しようとせずに盲目的に を使用することはあまり意味がありません。

Equals 演算子に関する主な懸念==は、比較される型に依存する比較規則によって、演算子が非推移的になる可能性があることです。たとえば、次の場合です。

A == B AND
B == C

次のことを実際に保証するわけではありません。

A == C

例えば:

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

Strict Equals 演算子===は、同じ型の値を比較する場合には実際には必要ありません。最も一般的な例は次のとおりです。

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

常に文字列であるtypeof演算子の結果を文字列リテラルと比較します...

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

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
}
于 2010-09-17T14:17:03.973 に答える
26

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

JSLint ドキュメントから:

==and演算子は、!=比較する前に型強制を行います。これは' \t\r\n' == 0、真であるため悪いことです。これにより、型エラーを隠すことができます。

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

値がtrueまたはfalsyであることのみを気にする場合は、短い形式を使用してくださいそれ以外の

(foo != 0)

言うだけ

(foo)

そして代わりに

(foo == 0)

いう

(!foo)

===and!==演算子が推奨されます。

于 2010-09-17T14:04:48.507 に答える
18

JSLint は、優れた JavaScript とは何かという個人的な考えを強制するものであることに注意してください。それが提案する変更を実装するときは、常識を使用する必要があります。

一般に、型と値を比較すると、コードがより安全になります (型変換が想定どおりに行われなくても、予期しない動作に遭遇することはありません)。

于 2010-09-17T14:01:43.420 に答える
15

Triple-equal は double-equal とは異なります。これは、2 つの辺が同じ値であるかどうかをチェックすることに加えて、triple-equal はそれらが同じデータ型であることもチェックするためです。

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

また、JavaScript は答えを返す前に型変換を行う時間を無駄にする必要がないため、Triple-Equal の方がわずかに速く実行されます。

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

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

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

于 2010-09-17T15:07:20.063 に答える
8

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

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

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

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

于 2010-09-17T14:03:45.547 に答える
4

虚偽をテストしたい場合。JSLintでは許可されていません

if (foo == null)

しかし許可します

if (!foo)
于 2015-06-24T19:39:11.697 に答える
3

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

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

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

参照

于 2013-03-14T16:28:25.500 に答える
2

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

于 2010-09-17T14:01:35.603 に答える