583

JavaScriptコードで次のコードパターンを頻繁に使用しています

if (typeof(some_variable) != 'undefined' && some_variable != null)
{
    // Do something with some_variable
}

同じ効果を持つ、あまり冗長でない確認方法はありますか?

いくつかのフォーラムや文献によると、単に次のように言っても同じ効果があるはずです。

if (some_variable)
{
    // Do something with some_variable
}

残念ながら、Firebugsome_variableは が未定義の場合、そのようなステートメントを実行時にエラーと評価しますが、最初のステートメントは問題ありません。これは Firebug の (望ましくない) 動作にすぎないのでしょうか、それともこれら 2 つの方法には実際に何らかの違いがありますか?

4

25 に答える 25

548

「value is nullor undefined」をテストする最も効率的な方法は

if ( some_variable == null ){
  // some_variable is either null or undefined
}

したがって、次の 2 行は同等です。

if ( typeof(some_variable) !== "undefined" && some_variable !== null ) {}
if ( some_variable != null ) {}

注1

質問で述べたように、短いバリアントはsome_variable宣言されている必要があります。そうでない場合、ReferenceError がスローされます。ただし、多くのユースケースでは、これが安全であると想定できます。

オプションの引数を確認します。

function(foo){
    if( foo == null ) {...}

既存のオブジェクトのプロパティを確認する

if(my_obj.foo == null) {...}

一方typeof、宣言されていないグローバル変数を処理できます (単純に を返しますundefined)。それでも、Alsciende 氏が説明したように、正当な理由により、これらのケースは最小限に抑える必要があります。

注2

この - さらに短い - バリアントは同等ではありません:

if ( !some_variable ) {
  // some_variable is either null, undefined, 0, NaN, false, or an empty string
}

それで

if ( some_variable ) {
  // we don't get here if some_variable is null, undefined, 0, NaN, false, or ""
}

注3

===一般的にはの代わりに使用することをお勧めします==。提案されたソリューションは、この規則の例外です。JSHint構文チェッカーeqnullは、この理由からオプションを提供しています。

jQuery スタイル ガイドから:

== を優先して、厳密な等価性チェック (===) を使用する必要があります。唯一の例外は、null を介して undefined と null をチェックする場合です。

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

編集 2021-03:

現在、ほとんどのブラウザはNullish 合体演算子 ( ??)論理的な nullish 割り当て(??=)を サポートしています。これにより、変数が null または未定義の場合に、より簡潔な方法でデフォルト値を割り当てることができます。次に例を示します。

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

これらの形式のいずれかとして書くことができます

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
于 2013-04-13T19:44:16.463 に答える
373

ケースを区別する必要があります。

  1. 変数はundefined、宣言されていても宣言されていなくてもかまいません。以外のコンテキストで宣言されていない変数にアクセスすると、エラーが発生しますtypeof
if(typeof someUndeclaredVar == whatever) // works
if(someUndeclaredVar) // throws error

宣言されているが初期化されていない変数は ですundefined

let foo;
if (foo) //evaluates to false because foo === undefined
  1. のような未定義のプロパティsomeExistingObj.someUndefProperty。未定義のプロパティはエラーを発生させず、単純に を返しますundefined。これは、ブール値に変換されると、 に評価されfalseます。したがって、 と を気にしない場合は 0false使用しても問題ありませんif(obj.undefProp)。この事実に基づく一般的なイディオムがあります。

    value = obj.prop || defaultValue
    

    これは、「objプロパティがある場合はpropに割り当てvalue、そうでない場合はデフォルト値を割り当てる」ことを意味しますdefautValue

    一部の人々は、この動作を混乱させ、見つけにくいエラーにつながると主張し、in代わりに演算子を使用することを推奨しています

    value = ('prop' in obj) ? obj.prop : defaultValue
    
于 2010-04-01T09:54:29.213 に答える
31

ES5 や ES6 などの新しい JavaScript 標準では、次のように言えます。

> Boolean(0) //false
> Boolean(null)  //false
> Boolean(undefined) //false

すべてが false を返します。これは、Python の空の変数のチェックに似ています。したがって、変数の周りに条件付きロジックを書きたい場合は、次のように言ってください。

if (Boolean(myvar)){
   // Do something
}

ここでは、「null」または「空の文字列」または「未定義」が効率的に処理されます。

于 2016-04-05T07:10:06.787 に答える
24

宣言されていない変数を参照しようとすると、すべての JavaScript 実装でエラーがスローされます。

オブジェクトのプロパティは、同じ条件の対象ではありません。オブジェクト プロパティが定義されていない場合、アクセスしようとしてもエラーは発生しません。したがって、この状況では次のように短縮できます。

 if (typeof(myObj.some_property) != "undefined" && myObj.some_property != null)

if (myObj.some_property != null)

これを念頭に置いて、グローバル変数がグローバル オブジェクトのプロパティとしてアクセスできるという事実 (windowブラウザの場合) を考慮して、グローバル変数に次のように使用できます。

if (window.some_variable != null) {
    // Do something with some_variable
}

ローカル スコープでは、変数がコード ブロックの先頭で宣言されていることを確認すると常に便利です。これにより、typeof.

于 2010-04-01T09:23:49.377 に答える
18

まず、何をテストするかを明確にする必要があります。JavaScript には、つまずくためのあらゆる種類の暗黙的な変換と、2 つの異なるタイプの等値比較演算子があります:=====.

test(val)次の特性をテストする、nullまたはundefined持つべき関数:

 test(null)         => true
 test(undefined)    => true
 test(0)            => false
 test(1)            => false
 test(true)         => false
 test(false)        => false
 test('s')          => false
 test([])           => false

ここにあるアイデアのどれが実際にテストに合格するか見てみましょう。

これらは機能します:

val == null
val === null || val === undefined
typeof(val) == 'undefined' || val == null
typeof(val) === 'undefined' || val === null

これらは機能しません:

typeof(val) === 'undefined'
!!val

これらのアプローチの正確性とパフォーマンスを比較するために、jsperf エントリを作成しました。さまざまなブラウザー/プラットフォームで十分な実行が行われていないため、当面の結果は決定的ではありません。お使いのコンピュータでテストを実行してください。

現時点では、簡単なval == nullテストで最高のパフォーマンスが得られるようです。それもほぼ最短です。val != null補完が必要な場合は、テストを無効にすることができます。

于 2014-02-27T12:48:22.450 に答える
8

唯一の完全で正しい答えはないので、要約してみます。

一般に、式は次のとおりです。

if (typeof(variable) != "undefined" && variable != null)

variableが宣言されていない可能性があるため、省略するtypeof(variable) != "undefined"と ReferenceError が発生するため、簡略化できません。ただし、コンテキストに応じて式を簡略化できます

variableglobalの場合、次のように簡略化できます。

if (window.variable != null)

localの場合、この変数が宣言されていない状況をおそらく回避でき、次のように単純化することもできます。

if (variable != null)

オブジェクトのプロパティであれば、ReferenceError について心配する必要はありません。

if (obj.property != null)
于 2013-12-28T19:44:30.663 に答える
2

理解するために、 undefined 、 null 、および '' (空文字列も) を変換したときに Javascript Engine によって返される値がどうなるかを分析してみましょう。開発者コンソールで同じことを直接確認できます。

ここに画像の説明を入力

すべてが false に変換されていることがわかります。これは、これら 3 つすべてが JavaScript による「存在の欠如」を想定していることを意味します。したがって、以下のようにコード内の 3 つすべてを明示的にチェックする必要はありません。

if (a === undefined || a === null || a==='') {
    console.log("Nothing");
} else {
    console.log("Something");
}

また、もう一つ指摘したいことがあります。

Boolean(0) の結果はどうなりますか?

もちろん嘘。これにより、期待される結果で 0 が有効な値である場合に、コードにバグが作成されます。そのため、コードを記述する際には、この点を確認してください。

于 2018-07-16T03:04:32.997 に答える
0

null 性 ( if (value == null)) または非 null 性 ( if (value != null)) のテストは、変数の定義ステータスのテストよりも冗長ではありません。

さらに、ブール値で定義されている場合、変数 (またはオブジェクト プロパティ) の存在を確認するためのテストif (value)(または ) は失敗します。買い手責任負担 :)if( obj.property)false

于 2014-06-25T09:03:13.993 に答える
0

どちらの値も、厳密な比較演算子を使用して簡単に区別できます。

作業例:

http://www.thesstech.com/tryme?filename=nullandundefined

サンプルコード:

function compare(){
    var a = null; //variable assigned null value
    var b;  // undefined
    if (a === b){
        document.write("a and b have same datatype.");
    }
    else{
        document.write("a and b have different datatype.");
    }   
}
于 2015-06-23T21:31:45.453 に答える
-1

次の形式の関数を定義する必要があります。

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}
于 2014-01-17T18:12:56.313 に答える