2

JavaScript コードでは、次の if ステートメントの double-equals 構造を置き換えたいと考えています。

if( name == null ) {
  //do stuff
}

double equals は、jshint ルール "eqeqeq" では失敗します。この場合、double equals を triple equals に置き換えることが推奨されます。== null少しの間、上記のコードが次のように変更されたと想像してみましょう=== null

if( name === null ) {
  //do stuff
}

これは、値を持つ明示的に定義された変数に対しては機能しますnullが、残念ながら、このような未設定の変数に対しては失敗します。

var a = null; // works correctly
var b;        // will fail in comparison

以前は、3 等号のルールが重要だったときに、次のようにしていました。

if( name === null ||| typeof(name) === 'undefined' )

しかし、これは非常に肥大化しています。

私が今思いつくことができる最善の代替手段は、if ステートメントの性質を使用し、式を否定して単純にその== null部分を削除する次のような false っぽい式に評価させることです。

if( !name ) {
  //do stuff
}

私にとって、これははるかに単純で読みやすく、明示的な等号比較を完全に回避します。ただし、ここで見逃しているエッジの原因があるかどうかはわかりません。

問題は、一般的に== nullif 文の否定式に置き換えることができるかということです。もしそうなら、それがうまくいかない落とし穴と例外は何ですか? 一般的な配列項目、文字列、オブジェクト プロパティで機能しますか?

ソリューションを選択するための私の基準は

  • きれいなコード
  • 読みやすく、すぐに理解できる
  • jshint ルールを検証します
  • 最新のブラウザーで動作します (2015 年 1 月現在)

等値演算子==vs===の違いを議論するための他のわずかに関連する質問を認識していますが、これは単に if ステートメント内の null っぽいものと比較した評価の議論のためのものです。

4

1 に答える 1

3

問題は、一般的に == null を否定式の if ステートメントに置き換えることができるかということです。

おそらく普遍的ではありませんが、おそらくいくつかの場所では.

もしそうなら、それがうまくいかない落とし穴と例外は何ですか? 一般的な配列項目、文字列、オブジェクト プロパティで機能しますか?

!valueチェックは、 と だけでなく、すべての falsey 値に対してtrueになります。完全なリストは次のとおりです: 、、、、そしてもちろん.nullundefinednullundefined0""NaNfalse

それで、あなたが持っているname = ""なら

if (!name) {
    // ...
}

... true と評価され、前のブロックに移動します

if (name == null) {
    // ...
}

...しません。そのため、どこでも行うだけで問題が発生する可能性があります。

しかし、誤った値で分岐したいことがわかっている状況では、!valueこれは非常に便利です。たとえば、変数がundefined(またはnull) またはオブジェクト参照であることを意味する場合、if (!obj)それをテストするために使用します。

JSHint のルールを使用し続けたい場合は===、ユーティリティ関数を自分自身に与えることができます。

function isNullish(value) {
    return value === null || typeof value === "undefined";
}

関数呼び出しのオーバーヘッドはまったく心配する必要はありません(詳細)。適切な JavaScript エンジンであれば、ホットスポットにある場合でもインライン化されます。

于 2015-01-31T09:31:30.480 に答える