JavaScriptで未定義またはnull変数を確認する方法は?


500

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

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

同じ効果があるより簡単なチェック方法はありますか?

いくつかのフォーラムや文献によると、単に次のことは同じ効果をもたらすはずです。

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

残念ながら、Firebugはそのようなステートメントをランタイムでのエラーとして評価しますsome_variable。これはFirebugの(望ましくない)動作のみですか、それともこれら2つの方法の間に本当に違いがありますか?


46
if(some_variable) { ... }またはまたは...の場合some_variableは実行されませんfalse0
kennytm

良い点;)しかし、私はそれがfalseまたは0であってはならないことを知っていて、それをいくつかのロジック(文字列、配列など)で使用できるかどうかを確認したいとしましょう
Tomas Vana


2
...または空の文字列。
デビッド・ギブン

回答:


333

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

  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ます。したがって、0andを気にしない場合はfalse、使用してif(obj.undefProp)も問題ありません 。この事実に基づいた一般的なイディオムがあります:

    value = obj.prop || defaultValue

    その手段「であればobjプロパティがありprop、それを割り当てvalue、それ以外の場合は、デフォルト値を割り当てますdefautValue」。

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

    value = ('prop' in obj) ? obj.prop : defaultValue

1
次に、hasOwnPropertyとプロトタイプについて説明します。[]内の'のindexOf' == [] .hasOwnProperty( 'の
Alsciende

1
はい、これを追加することを考えましたが、簡潔にするために完全性を犠牲にすることにしました。;)
user187291 2010

52
0とfalseの問題に対処しない
TMS

12
宣言されていない変数を意味します。変数は宣言できますが、値はまだですundefined
Tgr 2015年

1
またtypeof、文字列を返すことにも注意してください。したがって、var myVar; typeof(myVar)==undefined戻りfalseませんtrue
rism 2015年

417

「値は」nullまたは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)。しかし、アルシエンデが説明したように、これらのケースは正当な理由で最小限に抑える必要があります。

注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を使用して未定義およびnullをチェックする場合です。

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

1
非常に重要な違い(すでに質問で言及されています)。だからこそみんながtypeofを使っています。申し訳ありませんが、あなたの答えが役に立つところはわかりません。質問で言われたことを述べるだけで、最初の数行には間違っているとさえ述べています。
TMS

33
申し訳ありませんが、私は同意する必要があります;-)使用== nullは、「nullまたはundefined」をテストするのに最も効率的です(これは質問トピックです)。これは決して珍しいことではありません(jQuery 1.9.1で43回使用されています)。これは、変数が宣言されたことをよく知っているため、またはのような既存のオブジェクトのプロパティをテストするためif( o.foo == null)です。
mar10 2013

1
@ mar10(aUndefinedVar == null)では、「aUndefinedVar is not defined」エラーが発生します。
Rannnn 2013

7
この簡潔なオプションをありがとう。私のコードの99%では、nullと未定義を区別する必要はありません。したがって、このチェックの簡潔さにより、コードが雑然としてなくなります。
Ian Lovejoy 2016

1
グローバル変数をチェックするときにReferenceErrorを防ぐには、を使用しますwindow.someProperty == null。ローカル変数の場合、それらが宣言されていることを簡単に確認できます。書き込みをif (...) {var local = ""}書く代わりにvar local; if (...) { local = ""; }
Aloso

66

通常の等価性でnullをチェックすると、未定義の場合もtrueが返されます。

if (window.variable == null) alert('variable is null or undefined');

JS Equality


4
NaNはNanと等しくない?
Sharjeel Ahmed 2016

2
@monotheist NaNはNaNと等しくありません(MDNのNaNページを参照)。JavaScriptは、この動作を指定する浮動小数点にIEEE-754を使用します。これにはいくつかの考えがあります。stackoverflow.com/ a / 23666623/2563765を
スティーブン

1
@SharjeelAhmed数学的に修正されています。NaN差分方程式からは等しくなることは決して期待できません
Thaina

28

ES5やES6などの新しいJavaScript標準では、

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

すべてfalseを返します。これは、Pythonによる空の変数のチェックに似ています。したがって、変数の周りに条件付きロジックを記述したい場合は、

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

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


2
ie5のようにサポートされていますが、なぜこれはあまり知られていないのですか?
ヒマーター

12
OPはnull、およびとundefinedは異なるテストを望んでいました。他の偽の値はtrueを返します
Andre Figueiredo

1
条件に値を追加しません。条件はまったく同じように評価され、それでも0、に対してfalseを返しますNaN。これは、オブジェクトへの参照を保持せずにオブジェクトの真実性をキャプチャして、潜在的に大きなオブジェクトではなくそのオブジェクトを格納できるようにする場合に使用します。参考までに!!value、これはと同等です!。1つ目は真実性を否定し、2つ目はそれを再び否定します。
erich2k8

>参考までに、これは!! valueと同等です。真実を否定します。 どのFYIも、どれif (var)がbooleanにキャストされるかと同じなので、基本的に完全に役に立たない...
Cyril CHAPON

2
文字通りキーワードを使用している間は未定義Boolean(undefined)未定義であることしようと、作品を変数が ない仕事をし、それがnullまたは未定義のチェックを行うことの全体のポイントです。これif (Boolean(undeclareVarName)) { console.log('yes'); } else { console.log('no'); }は、「ReferenceError:undeclareVarNameが定義されていません」というReferenceErrorをスローします
Stephen P

22

宣言されていない変数を参照しようとすると、すべての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。これにより、を繰り返し使用する必要がなくなります。


11
NaN、0、 ""、およびfalseはありません。これらはnullでも未定義でもないので、falseでもあります。
AndreasKöberle2011

@AndreasKöberleは正しいです。非厳密な等価演算子でさえ、nullはNaN、0、 ""、およびfalseとは異なると述べています。if (myObj.some_property != null)同等の振る舞いをするためにあなたはしなければならないでしょう。
thejoshwolfe

15

まず、何をテストするかについて非常に明確にする必要があります。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エントリーを作成しました。異なるブラウザ/プラットフォーム間で十分な実行が行われていないため、結果は当面決定的ではありません。コンピューターでテストを実行するのに1分ほどかかります!

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


12

これは、==使用する必要がある唯一のケースです。

if (val == null) console.log('val is null or undefined')

3
2019年頃のこの回答には賛成票が不足していますが、このユースケースではKISSです。またval != null、反対の場合も、1つだけです。= @ Yukuleleを使用==するのはこの1つだけなので、見たときに何が行われるかがわかります。
DKebler、

7

完全で正しい答えは1つではないので、要約してみましょう。

一般的に、式:

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

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

variableグローバルの場合、次のように簡略化できます。

if (window.variable != null)

ローカルの場合、この変数が宣言されていない状況を回避し、次のように簡略化することもできます。

if (variable != null)

オブジェクトプロパティの場合、ReferenceErrorを心配する必要はありません。

if (obj.property != null)

navigator一部windowですか?の例外が発生したnavigator is not defined場合、window.navigator != nullテストを使用できますか?
jww 2015年

5

変数に値があるかどうかを確認できます。意味、

if( myVariable ) {
//mayVariable is not :
//null
//undefined
//NaN
//empty string ("")
//0
//false

}

変数が存在するかどうか(つまり、宣言されているかどうか)がわからない場合は、typeof演算子を使用して確認する必要があります。例えば

if( typeof myVariable !== 'undefined' ) {
    // myVariable will get resolved and it is defined
}

4

私はこの方法を使用してこれを行いました

変数にIDを保存する

var someVariable = document.getElementById("someId");

次にif条件を使用します

if(someVariable === ""){
 //logic
} else if(someVariable !== ""){
 //logic
}

3

回答の1つで述べたように、グローバルスコープを持つ変数について話している場合は、運が良い場合があります。ご存知かもしれませんが、グローバルに定義する変数は、windowsオブジェクトに追加される傾向があります。この事実を利用できるので、blehという変数にアクセスしているとしましょう。二重反転演算子(!!)を使用するだけです。

!!window['bleh'];

これは、blehが宣言されておらず、かつ値が割り当てられていない場合にfalseを返します。



3

これは、の==代わりに使用することが推奨される非常にまれな状況の例です===。式somevar == nullundefinedand に対してはtrueを返しますが、nullそれ以外の場合はfalseを返します(変数が宣言されていない場合はエラー)。

を使用する!=と、期待どおりに結果が反転します。

現代の編集者が使用するための警告ではないだろう==!=とオペレータnull、これはほとんど常に必要な動作であるとして、。

最も一般的な比較:

undeffinedVar == null     // true
obj.undefinedProp == null // true
null == null              // true
0 == null                 // false
'0' == null               // false
'' == null                // false

自分で試してください:

let undefinedVar;
console.table([
    { test : undefinedVar,     result: undefinedVar     == null },
    { test : {}.undefinedProp, result: {}.undefinedProp == null },
    { test : null,             result: null             == null },
    { test : false,            result: false            == null },
    { test : 0,                result: 0                == null },
    { test : '',               result: ''               == null },
    { test : '0',              result: '0'              == null },
]);

2

どんなyyyが定義されていない場合はnull、それはtrueを返します

if (typeof yyy == 'undefined' || !yyy) {
    console.log('yes');
} else {
    console.log('no');
}

はい

if (!(typeof yyy == 'undefined' || !yyy)) {
    console.log('yes');
} else {
    console.log('no');
}

番号



2

理解するために、undefined、null、および ''(空の文字列も)を変換するときにJavaScriptエンジンが返す値を分析してみましょう。開発者コンソールで直接確認できます。

ここに画像の説明を入力してください

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

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

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

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

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


2

あなたが持っているものと同様に、あなたは次のようなことをすることができます

if (some_variable === undefined || some_variable === null) { do stuff }


0

nullity(if (value == null))またはnon-nullity(if (value != null))のテストは、変数の定義ステータスをテストするよりも詳細ではありません。

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



0

if文の目的は、かどうかを確認する場合nullundefined、変数に値を代入する前に値、あなたが使用することができますNullish合体演算子をブラウザのサポートが限られているものの、は、JavaScriptで最後に使用可能です。caniuseのデータによると、ブラウザの48.34%のみがサポートされています(2020年4月現在)。

const a = some_variable ?? '';

これがあれば、変数が空の文字列(または任意の他のデフォルト値)に割り当てられることを保証するsome_variablenullまたはundefined

この演算子は、0およびなどの他のタイプの偽の値のデフォルト値を返さないため、使用例に最も適しています''


-1

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

validate = function(some_variable){
    return(typeof(some_variable) != 'undefined' && some_variable != null)
}

変数が宣言されていない場合、同じReferenceErrorが生成されます。
チャド

-1

ES5またはES6では、何度か確認する必要がある場合は、次の操作を実行できます。

const excluded = [null, undefined, ''];

if (!exluded.includes(varToCheck) {
  // it will bee not null, not undefined and not void string
}


-1

R.isNil(yourValue) Ramda を使用すると、Lodashを簡単に実行でき、他のヘルパーライブラリにも同じ機能があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.