変数が「未定義」か「null」かをどのように判断できますか?


2131

変数がであるundefinedかどうかを判断するにはどうすればよいnullですか?

私のコードは次のとおりです:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

しかし、これを行うと、JavaScriptインタープリターが実行を停止します。


回答:


2850

これを行うには、抽象等価演算子の品質を使用できます。

if (variable == null){
    // your code here.
}

null == undefinedがtrueであるため、上記のコードはとの両方をキャッチnullundefinedます。


5
firefoxでイベントがnullであり、エラーが実行をブロックするかどうかをテストしようとしています。「イベントが未定義です」
Entretoize

3
@MichaelFeverどうして動かないの?これをコピーしてコンソールに貼り付けます:const y = undefined; y == null;返されるはずですtrue
Seraf

2
@ChrisStryczynskiコメントの例では、y定数を宣言しましたが、比較でabcはありません(ではありませんy)。ChromeとFirefoxでテストyconsole.log(y == null);たところtrue、結果が出ました。エラーが発生した場合は=、比較==ではなく代入演算子を使用しようとしたconst可能性があります。これは、再割り当てできないため、エラーを返すことに意味があります。
プシェモ

2
関連する比較の実例。lgtm。
Ryan Haining

2
@ZaytsevDmitryなぜ変数が等しいか、nullまたはundefined変数が等しい場合に合格するかどうかのテストを期待します0か?問題は真実の値をテストすることではなく、nullまたはを明示的にテストすることundefinedです。
rodrigo-silveira

1108

キャッチするnullundefined同時に標準的な方法はこれです:

if (variable == null) {
     // do something 
}

-これは、より明示的ですが簡潔ではありませんが、100%同等です。

if (variable === undefined || variable === null) {
     // do something 
}

プロのJSを書くとき、当然のことながらその型の等価性と==vs の動作===が理解されます。したがって、使用==して比較するのはだけnullです。


もう一度編集

の使用を示唆するコメントtypeofは単に間違っています。はい、上記の私の解決策では、変数が存在しない場合にReferenceErrorが発生します。これは良いことです。このReferenceErrorは望ましいものです。他の言語でのコンパイラエラーのように、コードを出荷する前に間違いを見つけて修正するのに役立ちます。try/を使用するcatchと、制御できない入力で作業している場合。

コード内で宣言されていない変数への参照があってはなりません。


47
typeofを使用する方が安全です。
Mani Gandham 2014年

56
それはより文体的なポイントです。変数がで宣言されていない場合は、すべて、それは実際に著者の一部にだけ悪い書き込みます。変数が宣言されているかどうかを知る必要がありますが、それは問題ではありません。しかし、はい何らかの理由そうなった場合、これを単なるvariableではなくwindow.variableに変更する必要があります。これにより、参照エラーは発生しません。Typeofは避けてください。
temporary_user_name

6
はい、!==代わりに書いたからです!=
temporary_user_name

9
-OP:これらの比較が「100%同等」であるという記述は単純に間違っています。独自のEDITで指摘したように、2番目はReferenceErrorを引き起こします。アサーションについては、「コード内で宣言されていない変数への参照があってはなりません。」本当に?オプションのパラメーターについて聞いたことがありますか? jsfiddle.net/3xnbxfsu
Timothy Kanski 2017年

16
@TimothyKanskiオプションパラメータは、オプションで提供されていない場合は未定義である可能性がありますが、最も明確に宣言された変数です。それらは宣言され、値はundefinedと宣言されていますが、初期化されていない変数と同じです。つまりvar someVar;、引数は実際には成り立ちません
chiliNUT

228

上記の回答を組み合わせると、最も完全な回答は次のようになります。

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

これは、宣言されていない、または宣言されており、明示的にnullまたは未定義に設定されている変数に対して機能します。ブール式は、実際のnull以外の値を持つ宣言された変数に対してfalseと評価される必要があります。


2
@Aerovistae私はそれtypeofが関数ではなく演算子であることを認識しているので、括弧は必要ありませんが、それでも括弧はありがたいです。
user664833

1
typeofを使用する代わりにif(variable === undefined)を直接チェックするのはどうですか?
冷凍クレヨン

2
変数が宣言されていない場合にReferenceErrorが発生する@ArjunU。変数が宣言されているかどうかわからない場合は、上記の解決策を使用してください。変数が少なくとも宣言されていることを保証できる場合は、使用できますvariable == null
Rogue

3
@Rogueが指摘したように、変数が宣言されていない可能性があるため、これはより良いソリューションです。
アブドゥルサディクヤルシン2016年

私が間違っている場合は修正してください。最初の条件は2番目の条件のスーパーセットではないため、2番目の条件は不必要ですか。
3月3日、3月3

187
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
これが別の半解だと誰かが思った場合でも、これは実際に機能します。undefinedと等しいと評価されnullます。
チャック

3
Chromeコンソールで失敗しました... ReferenceError:変数が定義されていないため、機能する可能性がありますが、私には適していません...
Eran Medan

48
これは、宣言された変数に対してのみ機能し、宣言されているかどうかにかかわらず、まれなケースです。(その場合はtypeof + nullチェックを使用する必要があります)

11
ちょうど考え出し:あなたはこのコメントを追加することができ/*jshint eqnull:true */、あなたのJS文書または関数の先頭に、そしてJSHintはあなたの用途に関する警告を停止します== null
Web_Designer 2013年

3
@Aerovistae ==は、破損していることを明示的に示している参照を私に示すことができます。if(variable == null)この回答の強制力は、私には完全に理にかなっています...
ベンアストン

94
if (typeof EmpName != 'undefined' && EmpName) {

値が次の値でない場合、trueと評価されます。

  • ヌル

  • 未定義

  • NaN

  • 空の文字列( "")

  • 0


13
これは野火のように広まった危険なテクニックだと思います。チェックされる変数の多くはブール値または数値である可能性があるためです。したがって、ユーザーが結果を完全に理解していない場合、これは良くありません。
役に立つBee

このjavascript仕様の参照を提供してください
villamejia

1
これはと同じif (EmpName)です。もしそれundefinedがもうだめだろうなら。
ルディ

1
変数が定義されていない場合。次にif(EmpName)がエラーをスローします
Thamaraiselvam

1
@Thamaraiselvam私はルディがこれを意味したかもしれないと思いますvar EmpName; if (EmpName)。変数が定義されているが値が割り当てられていない場合。
hungerstar 2016年

28

jQueryのattr()空白文字列または実際の値(決してどちらかの機能が戻りますnullundefined)。返されるのundefinedは、セレクターが要素を返さなかったときだけです。

したがって、空の文字列に対してテストしたい場合があります。または、空の文字列、null、undefinedはfalse-yなので、次のようにすることができます。

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 mでこのエラーが発生します:ReferenceError: EmpName is not defined
Eran Medan

6
@EranMedan私はこれが遅いことを知っていますが、うまくいけば、後でここに来る人々を助けるでしょう。エラーが発生する理由は、それがまったく宣言されていないためです。通常、EmpName(または他の変数)を関数に渡すか、別の関数の戻り値を宣言する必要があるため、宣言します(例: "var x;")。未定義、null、または空白の文字列が返されたかどうかをテストするには、上記のソリューションを使用できます。
デイブ

これは冷静な質問だと思いundefinedますが、要素に属性が存在しない場合はjQueryが返されます(答えのように、セレクターに一致する要素がない場合だけではありません)。たとえば、imgwith no no for srcreturnundefined$('img').attr('src');
encodinghands

20

このために自分で関数を書くようになりました。JavaScriptは奇妙です。

文字通り何でも使えます。(これにより、変数に使用可能なが含まれているかどうかもチェックされます。ただし、この情報も通常必要なので、投稿する価値があると思います)。メモを残すことを検討してください。

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

TypeScript互換です。


この関数は、PHPの関数まったく同じことを行う必要がありempty()ますRETURN VALUES)。

考えてundefinednullfalse00.0"0" {}[]空のよう。

"0.0"NaN" "true空ではないと考えられています。


2
私は少しnullチェック問題に遭遇しました。渡されるパラメーターがnullであるか、空のオブジェクトであるかを確認したい{ }。これは一般的で愚かな言語の問題ですが、私はそれを忘れていました。すべての検索で、未定義のnull値、または緩やかな等価比較(==)に対する回答が表示されますが、厳密な等価(===)または同等のものは表示されません。そして、ページの一番下(私が賛成する前)にある-1のランクの答えは、私を逃れた答えです。 Object.keys( obj ).length < 1または=== 0、それが-1になることはないと仮定します。とにかく、0に賛成です。:p

おかげで、この関数をドロップして多くのコードをクリーンアップできました。なぜこれが標準のJS関数ではないのかは、私には理解できません。
アンディ

3
すべて=====ここに変更する必要があります。これは妥当な機能です。
ベンマッキンタイア

13

チェックしたい変数がグローバルの場合、

if (window.yourVarName) {
    // Your code here
}

このチェック方法では、yourVarName変数が存在しなくてもエラーはスローされません。

例:ブラウザがHistory APIをサポートしているかどうかを知りたい

if (window.history) {
    history.back();
}

仕組み:

windowプロパティとしてすべてのグローバル変数を保持するオブジェクトです。JavaScriptでは、存在しないオブジェクトプロパティにアクセスすることは合法です。場合は、historyその後、存在しないwindow.historyリターンをundefinedundefinedfalseなので、if(undefined){}ブロック内のコードは実行されません。


2
読者は、このようなアプローチが、ブラウザーで実行されているJavaScriptから、グローバル変数が宣言されているかどうか、特にブラウザー提供のグローバル(履歴APIなど)が使用可能かどうかをチェックするのに慣用的であることに注意する必要があります。それは動作しません非グローバル変数があるかどうかをチェックするnullundefined、またあなたのJavaScriptがブラウザ(つまり、Node.jsの中)外に実行されている場合、それは動作します。また0、に設定されているグローバル、falseまたは''宣言されていないグローバルと同じグローバル、または通常は問題ないまたはundefinedまたはも扱いますnull
Mark Amery 2015

これは、スクリプトがブラウザで実行されていることを前提としています。それは与えられたものではありません。
GreenAsJade 2016年

13

最短かつ簡単:

if(!EmpName ){
 // DO SOMETHING
}

EmpNameが次の場合、これはtrueと評価されます。

  • ヌル
  • 未定義
  • NaN
  • 空の
  • ストリング ("")
  • 0

3
ここでの使用例は、未定義とfalseの違いを知りたいというものです。次にnullのチェックを使用します。
gast128

12

おそらくこれを行う最も短い方法は次のとおりです。

if(EmpName == null) { /* DO SOMETHING */ };

ここに証明があります:

そして、ここに==(ソースはこちら)の詳細があります

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

ボーナス:(agcの回答を見て)===よりも明確な理由==

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


9

私はこの問題、つまりオブジェクトがnullであるかどうかを確認したところです。
私はこれを単に使用します:

if (object) {
    // Your code
}

例えば:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
var A = document.getElementById( "enterJob")if(A)A.className + = 'current';を設定することをお勧めします。このようにして、同じ結果を得るために50%の作業を行います。
Harry Svensson 2013年

8

あなたが使用しているのでjQueryのを、あなたは変数が定義されていないか、その値は、単一の関数を使用してヌルをあるかどうかを判断することができます。

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

これは私にはうまくいきませんでした。私はまだエラーが発生しました:ReferenceError: s is not defined最初の例について。
マーク

6

jQueryチェック要素がnullではありません:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

5

JavaScriptでは、私の知る限りでは、以下のように未定義、null、または空の変数をチェックできます。

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

すべての条件を確認します。

if(variable === undefined || variable === null || variable === ''){
}

var予約語である、これがスローされますSyntaxError
dhilt

5

あなたは単に以下を使用することができます(これを行うにはもっと短い方法があることを私は知っていますが、これは少なくともコードを見ている他の人にとって視覚的に観察することをより簡単にするかもしれません)。

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

4

確認する最も簡単な方法は次のとおりです。

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
これは、変数の値がの場合にコードを実行しますがfalse、これは望ましくない可能性があります。
byxor

「変数が「未定義」か「null」かを判断する方法は?」という質問は明らかです。また、JavaScriptでは、変数の値がnullまたは未定義の場合、その値はfalseです。
M.アーノルド

1
申し訳ありませんが、それは正しくありません。これは、それを証明するJSfiddleです。
byxor

あなたの答えによって、undefinednull および空の文字列のようないくつかの他のもの、+0、-0 NaNfalseを介して取得。!演算子はオペランドをここに強制しますvariable- ここから-ブール値へ:ecma-international.org/ecma-262/#sec-toboolean
Alireza

ただし、「変数が未定義かnullかを判断する方法」の質問を確認してください。ifで使用されるオペランドは、変数がnullまたは未定義の場合、常にtrueに戻ります。
M.アーノルド

3

以下のソリューションで:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

次のことを確認できます。

  • ヌル
  • 未定義
  • NaN
  • 空の
  • ストリング ("")
  • 0

これは「nullと未定義をどのようにキャッチするのか」という質問には答えません。「JavaScriptですべての誤った値をどのようにキャッチするのですか」ではありません。
temporary_user_name

@Aerovistae、私はconsole.log(isDeepEqual(null、null));でやったと思った およびconsole.log(isDeepEqual(undefined、undefined)); ?
Tony Tai Nguyen

2

変数がnullまたは未定義かどうかをテストするには、以下のコードを使用します。

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

閉じますが違います。失うtypeofとの比較undefinedまっすぐではなく文字列として。これは機能しますが、余分な演算子は効果的になり、より幅広にしています。
temporary_user_name

この場合、はい、そうです。typeofを使用する必要はありません。ただし、未定義の変数を扱う場合は、typeofを使用することをお勧めします。typeofを使用する1つの理由は、変数が宣言されていなくてもエラーをスローしないためです。
DanKodi 2016

それは実際には悪いことです。コード内で宣言されていない変数は必要ありません。変数を見つけて宣言できるように、ReferenceErrorをスローする必要があります。確かに、C ++のようなコンパイルされた言語ではそれを試さないでしょう。JSが許可しているからといって、それを実行する必要があるという意味ではありません。
temporary_user_name

1
orステートメントが逆です。何かが未定義であることを確認することは、最初のステップであり、2番目のステップではありません。
Anthony Rutledge 2016年

2

このテストはChromeコンソールで実行します。(void 0)を使用すると、未定義をチェックできます。

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

2

これを見てみましょう

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    上記では、変数はとしてのみ宣言されていappleます。この場合、メソッドを呼び出すalertと未定義と表示されます。

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

2番目の変数ではnullが表示されます。 apple値のます。

したがって、値が未定義であるかnullであるかを確認できます。

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

1

最良の方法:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

6
この厳密解は、すでに10月11日、2013年に@jkindwallによって提供されたstackoverflow.com/a/19323555/2943403それがページに新たな価値を付加しないので、このコードは専用のポストが完全に無用です。実際、それはページの膨張を追加し、研究者がそれを読むのに時間を浪費しています。この回答を削除してください。
mickmackusa

1
(null == undefined)  // true

(null === undefined) // false

なぜなら===はタイプと値の両方をチェックするからです。両方のタイプは異なりますが、値は同じです。


1
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
ユーザーが「undefined」という単語を入力するとどうなりますか?
チャック

あなたの質問はいいです、それは条件がtrueであることを示しているので、通常の未定義のオプションをtypeof条件に変更する必要があります。@チャック
KARTHIKEYAN.A 2016

これは間違っています。文字列のみがtypeof生成されることはありません。また、場合既に真であるので、第二のブールは、それが働いた場合でも、冗長になります。undefined'undefined'i == nulliundefined
temporary_user_name

1
このソリューション(条件が逆)は、2013年10月11日に@jkindwallによってすでに提供されています。stackoverflow.com/a/19323555/2943403このコードのみの投稿は、ページに新しい値を追加しないため、まったく役に立ちません。実際、それはページの膨張を追加し、研究者がそれを読むのに時間を浪費しています。この回答を削除してください。
mickmackusa

1

foo == nullチェックは、トリックを行うと最短の方法で「未定義またはnull」のケースを解決する必要があります。(「fooは宣言されていません」のケースを考慮していません。)しかし、(ベストプラクティスとして)3つのイコールを使用していた人々は、それを受け入れない可能性があります。eqeqeqまたはtriple-equalsを見てください eslintとtslintのルール...

変数がそうであるundefinednull個別にチェックするときの明示的なアプローチは、この場合に適用する必要があり、トピックへの私の貢献(現時点では27の非否定的な回答!)は、void 0チェックを実行するための短く安全な方法として使用することですためにundefined

foo === undefinedundefinedは予約語ではなく、シャドウ(MDN)できるため、使用は安全ではありません。typeof === 'undefined'チェックの使用は安全ですが、foo-is-undeclaredのケースを気にしない場合は、次のアプローチを使用できます。

if (foo === void 0 || foo === null) { ... }

1

それをチェックする関数を作成した場合:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

typeof nullを呼び出すと、「object」の値が返されます。これは、特別な値nullは空のオブジェクト参照と見なされるためです。Safariからバージョン5までとChromeからバージョン7までには、正規表現でtypeofを呼び出すと「関数」が返され、他のすべてのブラウザーでは「オブジェクト」が返されるという癖があります。


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

あなたは2番目のものしか使用できません:定義と宣言の両方をチェックするからです


-1

これらの2つの条件をテストする最良の/安全な方法は、値を文字列にキャストすることです。

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

これがテストを実行するための「最良/安全な方法」であると信じる理由を説明できますか?
sadmicrowave 2017年

変換では常に「標準化された」文字列(つまり、[object Undefined])が返されるため、偽の値をテストすることで問題が発生することはありません。それは、私が真実/虚偽の価値観を持っていた経験に基づいた私の意見です。
n1kkou 2017年

説明ありがとう。私は批判していません、それは興味深い答えです、なぜこれが他の方法よりも潜在的に優れているのかについて他の人にいくつかの説明を提供したかっただけです。
sadmicrowave 2017年

心配ない!この種の比較には多くの問題がありましたが、今までのところ、それがこの問題に対する最も有用なアプローチであると思います。
n1kkou

-2

typeofを使用するだけで、値が未定義かnullかどうかを確認できます。

if(typeof value == 'undefined'){

typeofについては、前の回答(stackoverflow.com/a/21273362/6305294)のコメントを参照してください。
2017

4
これは誤りです。キャッチしませんnull。何年も前に正しい完全な回答が与えられた質問に対して、なぜ新しい正しくない回答が提供されるのか理解できません。現在の答えはどういうわけか不十分だと思いますか?
temporary_user_name

-4

if(x==null)JavaScriptでは悪い考えです。で判断"=="-予期しない型強制を引き起こす可能性があり、CoffeeScriptで読み取ることができないため、条件判断で「==」または「!=」を使用しないでください

if(x)より良いでしょうが、0と ""に注意してください。これはfalseとして扱われ、equalメソッドは"!= null"is trueではありません。

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

JavaScriptのベストプラクティスをご覧ください。


3
これは完全に不正確であり、プロ級のフレームワークやソフトウェアをざっと調べれば、すぐにそれが裏付けられます。使用==と比較することnullで引くの標準的な方法とJSインチ 型強制はこの特定のコンテキストではリスクではなく、実際に両方を同時にキャッチするという目標を達成するために利用されています。何年も前に十分に解決された質問に対して、正しくない誤解を招く答えを提供する前に、言語の操作にもっと時間をかけてください。nullundefined==nullundefined
temporary_user_name

「==」を避けます。すべては常に変化し続けています、私はあなたと同意しません@Aerovistae
Albert.Qing

3
あなたは私に同意しません -JavaScriptの設定全体に同意しません。明確にしましょう。
temporary_user_name
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.