最近、このエラーが発生したときに、JSLintを介してコードの一部を実行していました。このエラーについて私が面白いと思うのは、すべての==が===であると自動的に想定することです。
それは本当に意味がありますか?タイプを比較したくないインスタンスがたくさん見られましたが、実際に問題が発生するのではないかと心配しています。
「期待される」という言葉は、これが毎回行われるべきであることを意味します.....それは私には意味がありません。
最近、このエラーが発生したときに、JSLintを介してコードの一部を実行していました。このエラーについて私が面白いと思うのは、すべての==が===であると自動的に想定することです。
それは本当に意味がありますか?タイプを比較したくないインスタンスがたくさん見られましたが、実際に問題が発生するのではないかと心配しています。
「期待される」という言葉は、これが毎回行われるべきであることを意味します.....それは私には意味がありません。
myVar == null
チェックをしていたら、はい、大きな変化です。; ^)Crockfordの主張は、コードの意味をより正確にしたということであり、それについて議論するのは難しいです。
回答:
型変換がどのように機能するか===
を理解しようとせずに、盲目的にを使用するIMOは、あまり意味がありません。
Equals演算子に関する主な懸念==
は、比較するタイプに応じた比較ルールによって、演算子が非推移的になる可能性があることです。たとえば、次の場合です。
A == B AND
B == C
それを実際に保証するものではありません:
A == C
例えば:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
===
最も一般的な例である同じタイプの値を比較する場合、StrictEquals演算子は実際には必要ありません。
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
}
===
コードの明確さです。==
恒等演算子ほど明確で理解できるものではないため、使用する合理的な状況はありません。演算子を理解しているかどうかではなく、ほとんど費用をかけずにコードを読みやすくする演算子を使用することです。アイデンティティオペレーターに反対している唯一の開発者は、ソロ開発者とチームで働いていない人々です。定義上、コードを書いている人は十分な目でレビューされていません。
there is no reasonable situation
重大な虚偽表示です。(ネイティブ)JavascriptタイプNumber
とについて考えてくださいString
。それらの存在は、Javascriptの作者が特定のユースケースを念頭に置いていたことを証明してい==
ます。にnew String('hi') === 'hi'
評価することfalse
は非常に明確だと本当に思いますか?'hi'
文字列と文字列の両方を受け入れることに対して関数の引数をテストするコードスニペットを作成し、それが明確であることを教えてください。
JSLintは、Javascript構文で許可されているよりも本質的に防御的です。
JSLintのドキュメントから:
==
そして!=
、オペレータは、比較する前に型の強制を行います。それ' \t\r\n' == 0
が真実になるので、これは悪いことです。これにより、タイプエラーをマスクできます。次の値のいずれかと比較する場合は、
===
or!==
演算子(型強制を行わない)を使用してください。0 '' undefined null false true
値が真実または偽であることにのみ関心がある場合は、短い形式を使用してください。の代わりに
(foo != 0)
言うだけ
(foo)
の代わりに
(foo == 0)
いう
(!foo)
===
そして!==
オペレーターが好ましいです。
==
。これ===
は特殊なケースです... JSLintは、使用==
がどういうわけか間違っているように見せようとします...ただし、これを試してください:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
。プリミティブ型には、それらの代わりとなる対応するクラス(Number
、String
)があり、Javascriptは、==
これらを自然に比較するために演算子に依存します。
JSLintは、優れたJavaScriptがどうあるべきかという1人の考えを強制することに注意してください。それが示唆する変更を実装するときは、常識を使用する必要があります。
一般に、型と値を比較すると、コードがより安全になります(型変換が想定どおりに機能しない場合でも、予期しない動作が発生することはありません)。
Triple-equalはdouble-equalとは異なります。これは、両側が同じ値であるかどうかをチェックするだけでなく、triple-equalもそれらが同じデータ型であることをチェックするためです。
ですから、("4" == 4)
は真ですが、("4" === 4)
は偽です。
また、JavaScriptは、答えを出す前に型変換を行うのに時間を無駄にする必要がないため、Triple-equalの実行速度もわずかに速くなります。
JSLintは、あいまいなバグを減らすことを目的として、JavaScriptコードを可能な限り厳密にすることを意図的に目的としています。データ型を尊重するように強制する方法でコードを記述しようとするこの種のことを強調しています。
しかし、JSLintの良いところは、それが単なるガイドであるということです。彼らがサイトで言うように、たとえあなたが非常に優れたJavaScriptプログラマーであったとしても、それはあなたの気持ちを傷つけるでしょう。しかし、あなたはそのアドバイスに従う義務を感じるべきではありません。それが言っていることを読んでそれを理解しているが、コードが壊れることはないと確信しているなら、何かを変更するように強制されることはありません。
何もしないという警告が表示されたくない場合は、JSLintにチェックのカテゴリを無視するように指示することもできます。
http://javascript.crockford.com/code.htmlからの引用:
===および!==演算子。
ほとんどの場合、===および!==演算子を使用することをお勧めします。==および!=演算子は、型強制を行います。特に、偽の値と比較するために==を使用しないでください。
JSLintは非常に厳密であり、「webjslint.js」は独自の検証に合格していません。
webjslint.js
検証しないことについて-私が今見ているエラーのほとんどは間隔に関係していますが。明らかに、JSLintを使用してJavaScriptをレビューするときは、常識と合理的な判断を使用する必要があります。
always
この引用は自動的に知恵として失格になります。スマートプログラマーは独断的ではありません。彼らは与えられた状況で最良のものを使用します。そして、彼らは言語の核心に組み込まれているツールを歓迎し、受け入れますjust never touch it
。単に。でそれを却下するだけではありません。=
結論:私のコードは(1文字を保存するだけでなく)短くなるため、サイトの読み込みが速くなり、帯域幅のコストが少なくなり、ユーザーへのサービスが向上します。
偽りをテストしたい場合。JSLintは許可しません
if (foo == null)
しかし、許可します
if (!foo)
===
JSLintが推奨するを使用します。
foo == null
nullまたは未定義をチェックします。!foo
null、未定義、0、および空の文字列をチェックします。
この質問を説明し、NetBeans(from)7.3がこの警告を表示し始めた理由を説明するために、これは誰かがこれをバグとして報告したときのNetBeansバグトラッカーの応答からの抜粋です。
JavaScriptでは==ではなく===を使用することをお勧めします。
==演算子と!=演算子は、比較する前に型強制を行います。'\ t \ r \ n' == 0が真になるので、これは悪いことです。これにより、タイプエラーをマスクできます。JSLintは、==が正しく使用されているかどうかを確実に判断できないため、==および!=をまったく使用せず、代わりに、より信頼性の高い===および!==演算子を常に使用することをお勧めします。
まあ、それは本当に問題を引き起こすことはできません、それはあなたにアドバイスを与えるだけです。それを取るか、それを残す。とはいえ、それがどれほど賢いかはわかりません。それが問題として提示されない状況があるかもしれません。