JavaScriptでnull値を確認するにはどうすればよいですか?


575

JavaScriptでnull値を確認するにはどうすればよいですか?以下のコードを書きましたが、機能しませんでした。

if (pass == null || cpass == null || email == null || cemail == null || user == null) {      

    alert("fill all columns");
    return false;  

}   

また、JavaScriptプログラムのエラーを見つけるにはどうすればよいですか?


テストしている値が実際にはnullであり、単なる空の文字列ではないことを確信していますか?
Jan-Peter Vos、

72
nulljsでのテストは、厳密な演算子を使用して行う必要があります===
davin

3
@davin-正しいですが、ここでは問題ではありません。それがステートメントであったとしても、それでも機能します。
Mark Kahn、

3
@cwolves、それが問題だと思ったら、そのコメントを答えにしました。私の言い回しを確認してください。私は明らかに、OPの実践に関連して言語についての一般的な発言を行っており、これが彼の問題を解決することを提案していません。
davin

2
@TRiG提案された変更は、質問の性質を根本的に変え、回答(自分のものではない)がコンテキストを失い、意味をなさなくなるところまで変更します。編集は単なるコメントであるべきです。
ic3b3rg 2014

回答:


742

JavaScriptは、「null」値のチェックに関して非常に柔軟です。私はあなたが実際に空の文字列を探していると思いますが、その場合、この単純なコードが機能します:

if(!pass || !cpass || !email || !cemail || !user){

これは空の文字列をチェックします("")、 、、null と数字とundefinedfalse0NaN

あなたは、具体的数字をチェックしている場合、それがミスによくある間違いであることに注意してください0、この方法では、とnum !== 0好適である(またはnum !== -1または~num(ハックコードに対してもチェックしている-1そのリターン機能用)) -1、例えばindexOf


4
このテストのどの部分がどの値に対応しているかを知ることは非常に役立ちます。時々あなたは特にそれを探しています。
inorganik

2
やや遅いステートメントですが、はい、@ inorganikごとにテストを実行できます。以下の私の回答を参照してください
WebWanderer

28
読者は、数値データに対してこのタイプのテストを使用するときは注意してください。使用しないでください!!!をテストするためにnull、またはundefinedあなたはまた、0の値を捨てるする場合を除き、通常、数値データに
ニックス

4
答え自体はこれを述べています:「...そして数字0...」。この答えは、コンテキスト(「ユーザー名、パスワード、電子メール」であると推測しています)が与えられているため、質問には完全に適切であり、0値をチェックしていません。しかし、この質問と回答の人気を考えると、回答自体で言及する価値があることに同意します。
マーク・カーン

4
@Hendeca- 目を丸める実際の質問のコードを読んでください。それは明らかにユーザー名とパスワードについて尋ねています。私は何も推測していません、私は丁寧でした。あなたが私が彼らが必要とするものに答えたのでなく、彼らが尋ねたものに答えたという事実に悩まされています、それはばかげています。これはSOです。ほとんどの場合、人々は何を求めているのかを知りません。元の質問のコンテキストでは、この答えは正しいです。ノイズの追加を停止します。
Mark Kahn

419

特に nullを確認するには、次のようにします。

if (variable === null)

このテストはしますONLYのために渡すnullとするために合格しないだろう""undefinedfalse0、またはNaN

さらに、「偽のような」値(に対して真を返すもの!variable)ごとに絶対チェックを提供しました。

一部の絶対チェックでは、absolutely equals: ===およびの使用を実装する必要があることに注意してくださいtypeof

ここでJSFiddleを作成して、個々のテストがすべて機能していることを示しています

各チェックの出力は次のとおりです。

Null Test:

if (variable === null)

- variable = ""; (false) typeof variable = string

- variable = null; (true) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Empty String Test:

if (variable === '')

- variable = ''; (true) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number




Undefined Test:

if (typeof variable == "undefined")

-- or --

if (variable === undefined)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (true) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



False Test:

if (variable === false)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (true) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (false) typeof variable = number



Zero Test:

if (variable === 0)

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (true) typeof variable = number

- variable = NaN; (false) typeof variable = number



NaN Test:

if (typeof variable == 'number' && !parseFloat(variable) && variable !== 0)

-- or --

if (isNaN(variable))

- variable = ''; (false) typeof variable = string

- variable = null; (false) typeof variable = object

- variable = undefined; (false) typeof variable = undefined

- variable = false; (false) typeof variable = boolean

- variable = 0; (false) typeof variable = number

- variable = NaN; (true) typeof variable = number

ご覧のとおり、に対してテストするのは少し難しいNaNです。


9
===厳密な等価性を使用する場合、型チェックの目的は何ですか?ありがとう。また、NaNテストisNaN(value)ではtrue、変数がNaNと等しい場合にのみ返されるテストを使用できます。
Michael Malinovskij 2015

16
variable === nullタイプが「オブジェクト」ではない場合がありますか?ない場合は、チェックをvariable === nullに簡略化して、2番目の論理積を捨ててみませんか?ありがとう。
湖南ロストミアン2015

7
@HunanRostomyanいい質問です。正直なところ、いや、あるとは思いません。このJSFiddleでここでvariable === nullテストしたものを使用すれば、おそらく十分に安全です。`&& typeof variable === 'object'`も使用した理由nullは、値がtypeof objectであるという興味深い事実を説明するためだけでなく、他のチェックのフローを維持するためでもありました。しかし、はい、結論として、単純に使用しても安全ですvariable === null
WebWanderer 2015

1
jsfiddle.net/neoaptt/avt1cgem/1これが関数に分解されたこの答えです。あまり便利ではありませんが、とにかくやった。
Neoaptt

1
私は、ほとんど決して良い考えではないことをします。この回答のコードを変更します。具体的には、nullをチェックするときに、型オブジェクトのまったく不要なテストを削除します。これは基本的なコードスニペットです。1 人の初心者でも、詳細なテストを行う必要があることを誤解することはお勧めできません。
ToolmakerSteve

59

単に置き換える==との===すべての場所で。

== 緩やかなまたは抽象的な等式比較

=== 厳密な等価比較です

詳細については、同等性の比較と同一性に関するMDNの記事を参照してください。


2
これはあなたundefinedがそうではないと考えた場合にのみ機能しますnull。そうしないと、予期しない多くの動作が発生します。一般に、偽の値ではなくnull/の両方に興味がある場合はundefined、を使用します==(そうする必要がある数少ないケースの1つ)。
Andrew Mao

2
@AndrewMao undefined そうではありませんnullstackoverflow.com/a/5076962/753237
ic3b3rg 2016年

2
@AndrewMaoが言っていたのは、本当にそうだと思います。彼の最初の文は、「これはundefinedとnullが実質的に同等ではない状況でのみ機能する」と書き直される可能性があります。
BobRodes 2016年

1
@BobRodes私の悪い文章を明確にしてくれてありがとう、私はそれを感謝します:)
Andrew Mao

@AndrewMaoどういたしまして。そして、私はあなたの文章を個人的に貧弱だとは言いません。それは平均よりかなり良いと思います。:)
BobRodes 2016年

30

厳密な等価演算子:-

nullをチェックできます ===

if ( value === null ){

}

使用するだけで if

if( value ) {

}

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

  • ヌル
  • 未定義
  • NaN
  • 空の文字列( "")
  • 0

9

明示的にチェックすることで、受け入れられた回答を改善しnullますが、構文は単純化されています。

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
}

// Test
let pass=1, cpass=1, email=1, cemail=1, user=1; // just to test

if ([pass, cpass, email, cemail, user].every(x=>x!==null)) {
    // your code here ...
    console.log ("Yayy! None of them are null");
} else {
    console.log ("Oops! At-lease one of them is null");
}


6

まず、関数本体のないreturnステートメントがあります。エラーがスローされる可能性があります。

チェックを行うよりクリーンな方法は、単に!オペレーター:

if (!pass || !cpass || !email || !cemail || !user) {

    alert("fill all columns");

}

12
そのコードはおそらく関数内にあり、彼はそれを表示しませんでした;)
Mark Kahn

4

ついにトライキャッチを使えます

 try {
     document.getElementById("mydiv").innerHTML = 'Success' //assuming "mydiv" is undefined
 } catch (e) {

     if (e.name.toString() == "TypeError") //evals to true in this case
     //do something

 } finally {}   

throwあなた自身のエラーもできます。参照してくださいこれを


1
これは「偏執狂的」なコードと見なされます。あなたが本当にこのようなものを書いたとしたら、それは「mydiv」がおそらく存在し得ないことを理解したことでしょう。そうだと確信できない限り、このコードに到達すべきではありません。そのような行を試みる前に確信があることを確認するために、応答コードなどの多くの手段があるはずです。
calql8edkos

制御のフローには、try and catchを使用しないでください。これは良い解決策ではありません。
Andrew S

4

JavaScriptでは、に等しい文字列はありませんnull

たぶん、が空の文字列である場合、pass == nulltrueであると予期していた可能性passがあります。それは、緩やかな等価演算子==が特定の種類の型強制を実行することを知っているためです。

たとえば、次の式は真です。

'' == 0

対照的に、厳密な等価演算子===はこれが偽であると言っています:

'' === 0

ことを考える''0緩く等しく、あなたは可能性が合理的に推測こと''null緩く等しいです。ただし、そうではありません。

この式は偽です:

'' == null

文字列と比較した結果nullは偽です。したがって、pass == null他のすべてのテストは常にfalseであり、ユーザーがアラートを受け取ることはありません。

コードを修正するには、各値を空の文字列と比較します。

pass === ''

それpassが文字列であることが確かな場合はpass == ''、空の文字列だけが空の文字列と大まかに等しいため、も機能します。一方、緩やかな等値演算子が実行する型強制を特に実行したくない場合を除き、JavaScriptでは常に厳密な等値を使用することをお勧めします。

大まかに等しい値のペアを知りたい場合は、このトピックに関するMozillaの記事の「同一性の比較」の表を参照してください。


4

JavaScript で未定義nullをチェックするには、次のように記述するだけです。

if (!var) {
        console.log("var IS null or undefined");
} else {
        console.log("var is NOT null or undefined");
}

6
!varは、0、 ""、NaN、およびfalseでもtrueです。
Matt

3

これは、NaNのチェックに関するWebWandererのソリューションに関するコメントです(正式なコメントを残すのに十分な担当者がいません)。ソリューションは次のようになります

if(!parseInt(variable) && variable != 0 && typeof variable === "number")

しかし0、のように丸められる有理数の場合、これは失敗しvariable = 0.1ます。より良いテストは:

if(isNaN(variable) && typeof variable === "number")

1
バグGabrielを指摘してくれてありがとう、私は私の修正を私の答えに入れました。それとは別に、に変更することでテストを修正することができましparseIntparseFloat (そもそもそれは私には明白だったはずです)。isNan多くの開発者がisNaN、値が入りブール値が出てくるある種の「魔法の箱」のような関数を見るかのように感じるので、関数の使用を避けました。テストをもう少し深くしたかったのです。しかし、はい、あなたの提案されたテストは機能し、使用するのにまったく問題ありません。すみません、今まで気づかなかった投稿です。
WebWanderer 2015

1
すばらしいですね。なぜあなたも避けたのかについてのコメントをありがとうisNaN、私はその論理を後回しにすることができます。Underscore.jsメソッドもあります。これはさらに混乱/ブラックボックスのようですが、を利用しているため、とにかく注目に値しNaN !== NaNます。Object.prototype.toString.call(variable) === '[object Number]' && variable !== +variable
ガブリエル

2

実際に使用する必要があると思うのは、使用 if (value !== null || value !== undefined) するif (value)場合は0またはfalse値もフィルタリングする可能性があるためです。

次の2つの関数を検討してください。

const firstTest = value => {
    if (value) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}
const secondTest = value => {
    if (value !== null && value !== undefined) {
        console.log('passed');
    } else {
        console.log('failed');
    }
}

firstTest(0);            // result: failed
secondTest(0);           // result: passed

firstTest(false);        // result: failed
secondTest(false);       // result: passed

firstTest('');           // result: failed
secondTest('');          // result: passed

firstTest(null);         // result: failed
secondTest(null);        // result: failed

firstTest(undefined);    // result: failed
secondTest(undefined);   // result: failed

私の状況では、値がnullで未定義であるかどうかを確認する必要があるだけで、0or falseまたは''値をフィルタリングしたくありませんでした。したがって、2番目のテストを使用しましたが、それらもフィルタリングする必要があり、最初のテストを使用する可能性があります。


1

値がnullかどうかをテストする別の方法を見つけました。

if(variable >= 0 && typeof variable === "object")

null働きnumberobject同時に。比較null >= 0またはnull <= 0結果はになりtrueます。null === 0orまたはnull > 0or null < 0を比較するとfalseになります。しかしnull、オブジェクトでもあるので、それをnullとして検出できます。

私はより複雑な関数を作成しました。natureはtypeofよりも優れており、どのタイプを含めるか、またはグループ化しておくかを伝えることができます

/* function natureof(variable, [included types])
included types are 
    null - null will result in "undefined" or if included, will result in "null"
    NaN - NaN will result in "undefined" or if included, will result in "NaN"
    -infinity - will separate negative -Inifity from "Infinity"
    number - will split number into "int" or "double"
    array - will separate "array" from "object"
    empty - empty "string" will result in "empty" or
    empty=undefined - empty "string" will result in "undefined"
*/
function natureof(v, ...types){
/*null*/            if(v === null) return types.includes('null') ? "null" : "undefined";
/*NaN*/             if(typeof v == "number") return (isNaN(v)) ? types.includes('NaN') ? "NaN" : "undefined" : 
/*-infinity*/       (v+1 === v) ? (types.includes('-infinity') && v === Number.NEGATIVE_INFINITY) ? "-infinity" : "infinity" : 
/*number*/          (types.includes('number')) ? (Number.isInteger(v)) ? "int" : "double" : "number";
/*array*/           if(typeof v == "object") return (types.includes('array') && Array.isArray(v)) ? "array" : "object";
/*empty*/           if(typeof v == "string") return (v == "") ? types.includes('empty') ? "empty" : 
/*empty=undefined*/ types.includes('empty=undefined') ? "undefined" : "string" : "string";
                    else return typeof v
}

// DEMO
let types = [null, "", "string", undefined, NaN, Infinity, -Infinity, false, "false", true, "true", 0, 1, -1, 0.1, "test", {var:1}, [1,2], {0: 1, 1: 2, length: 2}]

for(i in types){
console.log("natureof ", types[i], " = ", natureof(types[i], "null", "NaN", "-infinity", "number", "array", "empty=undefined")) 
}


1

私は不思議に働くこの非常にシンプルな関数を作りました:

function safeOrZero(route) {
  try {
    Function(`return (${route})`)();
  } catch (error) {
    return 0;
  }
  return Function(`return (${route})`)();
}

ルートは、爆発する可能性のある値のチェーンです。jQuery / cheerioやオブジェクトなどに使用します。

例1:このような単純なオブジェクトconst testObj = {items: [{ val: 'haya' }, { val: null }, { val: 'hum!' }];};

しかし、私たちが作成したことのない非常に大きなオブジェクトである可能性もあります。だから私はそれを通過させます:

let value1 = testobj.items[2].val;  // "hum!"
let value2 = testobj.items[3].val;  // Uncaught TypeError: Cannot read property 'val' of undefined

let svalue1 = safeOrZero(`testobj.items[2].val`)  // "hum!"
let svalue2 = safeOrZero(`testobj.items[3].val`)  // 0

もちろん、必要に応じて、nullまたは'No value'... を使用できます。

通常、DOMクエリまたはjQueryセレクターが見つからない場合、エラーがスローされます。しかし、次のようなものを使用します:

const bookLink = safeOrZero($('span.guidebook > a')[0].href);
if(bookLink){
  [...]
}

1

lodashモジュールを使用して、値がnullまたは未定義であることを確認できます

_.isNil(value)
Example 

 country= "Abc"
    _.isNil(country)
    //false

   state= null
    _.isNil(state)
    //true

city= undefined
    _.isNil(state)
    //true

   pin= true
    _.isNil(pin)
    // false   

参照リンク:https : //lodash.com/docs/#isNil


0

これは、DB for exからのブール値の場合には機能しません。

 value = false

 if(!value) {
   // it will change all false values to not available
   return "not available"
 }

0

私の知る限りではJAVASCRIPT変数であると宣言が、値が割り当てられていない、そのタイプがありますundefined。したがって、valueの代わりにインスタンスobject保持する場合でも、変数をチェックできます

nullをチェックしてヘルパーメソッドを作成し、それを返しtrueてAPIで使用します。

変数が空かどうかを確認するヘルパー関数:

function isEmpty(item){
    if(item){
        return false;
    }else{
        return true;
    }
}

try-catch例外的なAPI呼び出し:

try {

    var pass, cpass, email, cemail, user; // only declared but contains nothing.

    // parametrs checking
    if(isEmpty(pass) || isEmpty(cpass) || isEmpty(email) || isEmpty(cemail) || isEmpty(user)){
        console.log("One or More of these parameter contains no vlaue. [pass] and-or [cpass] and-or [email] and-or [cemail] and-or [user]");
    }else{
        // do stuff
    }

} catch (e) {
    if (e instanceof ReferenceError) {
        console.log(e.message); // debugging purpose
        return true;
    } else {
        console.log(e.message); // debugging purpose
        return true;
    }
}

いくつかのテストケース:

var item = ""; // isEmpty? true
var item = " "; // isEmpty? false
var item; // isEmpty? true
var item = 0; // isEmpty? true
var item = 1; // isEmpty? false
var item = "AAAAA"; // isEmpty? false
var item = NaN; // isEmpty? true
var item = null; // isEmpty? true
var item = undefined; // isEmpty? true

console.log("isEmpty? "+isEmpty(item));

1
何?この回答はこの投稿とは関係ありません。このスレッドにこの回答を誤って投稿しましたか?
WebWanderer 2015年

このisEmpty関数はとまったく同じように動作します!。関数を発明する必要はありません。ただしてくださいif (!pass || !cpass || !email ...)。(これは既に承認済みの回答に示されています。)また、WebWandererのコメントによると、この投稿の真ん中の部分である「try-catch例外的なAPI呼び出し」は、この質問には関係がないようです。あなたの意図を説明してください-それはいつ役に立ちますか?それは質問とどのように関係していますか?
ToolmakerSteve

0

エラー状態の確認:

// Typical API response data
let data = {
  status: true,
  user: [],
  total: 0,
  activity: {sports: 1}
}

// A flag that checks whether all conditions were met or not
var passed = true;

// Boolean check
if (data['status'] === undefined || data['status'] == false){
  console.log("Undefined / no `status` data");
  passed = false;
}

// Array/dict check
if (data['user'] === undefined || !data['user'].length){
  console.log("Undefined / no `user` data");
  passed = false;
}

// Checking a key in a dictionary
if (data['activity'] === undefined || data['activity']['time'] === undefined){
   console.log("Undefined / no `time` data");
   passed = false;
}

// Other values check
if (data['total'] === undefined || !data['total']){
  console.log("Undefined / no `total` data");
  passed = false;
}

// Passed all tests?
if (passed){
  console.log("Passed all tests");
}

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