5

これは、SOに関する他の多くの質問と似ていますが、私が見つけたものとまったく同じではありません。

Javascriptで未定義の値をチェックするための最良のアプローチはどれですか、そしてその理由は何ですか?

最初の例:

var a;
if (typeof(a) === 'undefined'){...}

2番目の例:

var a;
if (a === undefined){...}

したがって、最初の例は型の名前を文字列と比較し、2番目の例は、型と値が同じであることを確認する等式演算子を使用して、変数を未定義のオブジェクトと比較します。

どちらが良いですか?それとも、両方とも互いに同じくらい良いですか?

undefinedとnull、またはtrueまたはfalseの違いについては質問していないことに注意してください。これらの2つの方法のどちらが正しいか、または優れているかだけです。

4

3 に答える 3

10

変数が存在しない場合、それを使用しようとすると、たとえそれをと比較している場合でも、参照エラーが発生しますundefined。したがって、常にを使用してtypeofください。

> foo === undefined
ReferenceError: foo is not defined
    at repl:1:2
    at REPLServer.eval (repl.js:80:21)
    at Interface.<anonymous> (repl.js:182:12)
    at Interface.emit (events.js:67:17)
    at Interface._onLine (readline.js:162:10)
    at Interface._line (readline.js:426:8)
    at Interface._ttyWrite (readline.js:603:14)
    at ReadStream.<anonymous> (readline.js:82:12)
    at ReadStream.emit (events.js:88:20)
    at ReadStream._emitKey (tty.js:320:10)
> typeof foo === "undefined"
true

(不正な)コードがを上書きする可能性もありますundefined。これにより、未定義の値がに等しくなりませんundefined

于 2012-05-28T20:53:57.873 に答える
1

undefined値を割り当てることができ、タイプチェックは機能しません。コードの範囲が保護されていない限り、たとえば

(function(undefined){
    var a;
    if (a === undefined) {
})();
// note called without parameter, so undefined is actually an undefined value

このチェック方法は安全ではなく、最初の方法が推奨されます

編集:ECMA 5は未定義に値を割り当てることを拒否しているようですが、それでもこれはブラウザーの実装に依存します。

于 2012-05-28T20:54:29.280 に答える
0

2つの方法は正しいですが、typeof1つはの値の変更の影響を受けませんundefined。より厳密なチェックが必要な場合は、を使用してtypeof()ください。

ECMA 3標準では、undefinedの値を次のように変更できます。

undefined = "not undefined";

undefinedそして、これは後で比較するときに醜さにつながる可能性があります。ECMA 5では、これは許可されていません。これは、最近のほとんどのブラウザでは、の値を設定できないことを意味しundefined、を使用しても安全である必要があります=== undefined

また、チェックしている変数が定義されているかどうかさえわからない場合は、を使用する必要があります。定義されていtypeofない場合は、参照エラーが発生します。

于 2012-05-28T20:59:54.327 に答える