0

javascript で null と undefined の両方をテストする理由を理解しています。

var declared;
...
if ('undefined' !== typeof declared && null !== declared) {
    // do something with declared
}

また

function doSomethingWithDefined(defined) {
    if ('undefined' !== typeof declared && null !== declared) {
        // do something with declared
    }
}

この文を短くする方法はありますか? かなり冗長なパターンです。

4

1 に答える 1

3

次のように変数を定義すると、次のようになります。

var defined;

値はありませんが、参照が存在するため、ReferenceError は発生しません。何も参照していないだけです。したがって、以下は有効です。

if (defined != null) { ... }

このような関数の場合

function doSomethingWithDefined(defined) {
    if (defined != null) { ... }
}

次のように翻訳できます。

function doSomethingWithDefined() {
    var defined = arguments[0];
    if (defined != null) { ... }
}

変数は暗黙的に宣言されているため (ただし、必ずしも定義されているわけではありません)、これを実行しても例外は発生しないため、typeof.

doSomethingWithDefined("value"); // passes defined != null
doSomethingWithDefined(); // defined == null, but no exception is thrown

typeof 演算子は通常、変数が宣言されているかどうかわからない場合に使用されます。ただし、現実世界のすべてのシナリオで機能する代替手段があります。

if (window.myvariable != null) {
    // do something
}

考慮すべき非パラメーター変数はグローバル変数のみであるため、プロパティ アクセスを使用して例外を回避することもできます。


とはいえ、型回避ではなく、型チェックを強くお勧めします。ポジティブになれ!

文字列ですか?

if (typeof declared === "string"){ ... }

配列ですか?

if (typeof declared === "object" && declared.length != null){ ... }

非配列オブジェクトですか?

if (typeof declared === "object" && declared.length == null){ ... }

関数ですか?

if (typeof declared === "function"){ ... }
于 2013-08-03T21:03:30.597 に答える