JavaScriptによるnullと未定義の比較、および==と===の違い


579
  1. それはだかどうかはどのように変数をチェックしますnullか、undefinedとの違いは何であるnullとはundefined

  2. 違いは何ですか =====(Googleで "==="を検索するのは難しいですか?


10
2.違い==とは===よくされてここで説明します
ウズベクホン2013

1. ==の代わりに===を使用するJavaScriptは2種類の等価演算子を使用します。!==および== | !=比較するときは常に前者のセットを使用することがベストプラクティスと見なされています。「2つのオペランドの型と値が同じ場合、===はtrueを生成し、!==はfalseを生成します。」-JavaScript:良い部分ただし、==および!=を使用する場合、さまざまなタイプを使用するときに問題が発生します。これらの場合、値を強制的に変換しようとしますが、失敗します。code.tutsplus.com/tutorials/…– jasonleonhard '19
20:23

4
Googleで「厳密な等値演算子」を検索すると、非常に関連性の高い結果が取得されます
Danield

lodash.com/docs#isNil関数を使用して変数がnullまたは未定義かどうかを確認できる多くの答えをここに追加します
Kfir Erez

回答:


936

変数をチェックするにはどうすればnullよいundefinedですか...

変数ですnull

if (a === null)
// or
if (a == null) // but see note below

...しかし、場合、後者の意志はまた真で注意aISundefined

それはundefined

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

...しかし、繰り返しになりますが、最後のものはあいまいです。あれば、それもまた真なりaですnull

さて、上記にもかかわらず、 それらをチェックする通常の方法は、それらが誤っているという事実を使用することです:

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

これは、仕様のToBooleanで定義されています。

...との違いは何であるnullとはundefined

どちらも通常、何かが存在しないことを示すために使用される値です。undefinedより一般的なもので、他の値が割り当てられるまで変数のデフォルト値として、関数が呼び出されたときに提供されなかった関数引数の値として、およびオブジェクトを要求したときに取得する値として使用されます持っていないプロパティの場合。ただし、これらすべての状況で明示的に使用することもできます。(プロパティを持たないオブジェクトと値を持つプロパティを持つことにはundefined違いがあります。値を持つ関数を呼び出すことには違いがあります。undefined引数でと、その引数を完全にオフにすることにます。)

nullよりも少し具体的ですundefined:空白のオブジェクト参照です。もちろん、JavaScriptは緩やかに型付けされていますが、JavaScriptが相互作用するすべてのものが緩く型付けされているわけではありません。ブラウザーのDOMのようなAPIが空のオブジェクト参照を必要とする場合null、ではなくを使用しますundefined。同様に、DOMのgetElementById操作はオブジェクト参照を返します—有効な参照(DOM要素が見つかった場合)、またはnull(なかった場合。

興味深いことに(またはそうではない)、それらは独自のタイプです。つまり、nullNull型undefinedの唯一の値であり、Undefined型の唯一の値です。

「==」と「===」の違いは何ですか

それらの間の唯一の違いは==、値を一致させるために型強制を行うが、一致し===ないことです。したがって、たとえば"1" == 1がに"1"強制されるため、trueになり1ます。しかし、"1" === 1ある型が一致しないため、。("1" !== 1trueです。)の最初の(実際の)ステップ===は、「オペランドのタイプは同じですか?」です。答えが「いいえ」の場合、結果はfalseです。タイプが同じである場合、それは正確に何をするか==です。

型強制は非常に複雑なルールを使用しており、驚くべき結果をもたらす可能性があります(たとえば、"" == 0true)。

仕様の詳細:


122
TJの答えを抽出するには、===は値と型が同じであることを意味します。
スラッピー

13
@Slappy::-) @ MUG4N:はい、そうです。if (a) { ... }a真実である場合」を意味します。「真実」は、非ゼロ、非ヌル、非未定義、非偽、非空ストリングの値です。:-)
TJクロウダー

4
ええと...ダウン投票者は、これが(ダウン投票ボタンのツールチップを引用するために)「役に立たなかった」と思う理由に関するいくつかの有用なフィードバックを共有するように気をつけますか?
TJクラウダー2013年

2
@Željko:私はこの点でクロックフォードが間違っているかもしれないと思う。オブジェクトnullはないことは事実であり、「オブジェクトなし」を意味するオブジェクト参照です。それは(例えば、彼らはオブジェクト参照を提供したときにホストが提供するインタフェースを使用していますが、提供するものを持っていないものだから、これは重要であるとき、その親に最後の要素である、またはそのIDでどの要素がない場合)。ホストがこれに使用するテクノロジーは、JavaScriptが変数/プロパティタイプに関するものほど柔軟ではない可能性があるため、(とは対照的に)obj ref が必要でした。node.nextSiblingnodegetElementByIdnullundefined
TJクラウダー2013

2
私はクロックフォードが間違っていることに同意する必要があります。typeof null「オブジェクト」を返すことには意味があります。間違いなくとは異なる値を返す必要があるため、意味のある他の唯一の値は「null」typeof undefinedです。nullはnullオブジェクト参照を表します。これは、少なくとも、それを保持する変数が何らかのタイプの「オブジェクト」用であることを意味します。それが間違いだったら、それは良い間違いだった。とにかく、答えに関しては、特にデバッグの目的で、クロスウィンドウスクリプティング中のundefined!== に関するヒントundefinedを知っておくと役に立ちます。
Triynko 2014年

93

違いは微妙です。

JavaScriptでは、undefined変数は宣言されていない、または値が割り当てられていない変数です。var a;たとえば、次のaように宣言するとしますundefined。これは、値が割り当てられていないためです。

あなたが割り当てた場合でもa = null;、その後a、今になりますnull。JavaScript nullではオブジェクトです(typeof null信じられない場合はJavaScriptコンソールで試してください)。つまり、nullは値です(実際にundefinedは値です)。

例:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

これは、関数の引数で役立ちます。デフォルト値を使用することもできますが、nullを許容できると見なします。その場合、次のようにすることができます。

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

optionalパラメータを省略した場合、doSomething(1, 2) thenoptionalは"three"文字列になりますが、渡した場合doSomething(1, 2, null)はoptionalになりますnull

等しいとして==厳密に等しい===厳密な値のタイプについてもチェックを等しくしながら、コンパレータ、最初のものは、弱いタイプです。つまり、0 == "0"trueが返されます。0 === "0"数値は文字列ではないため、while はfalseを返します。

これらの演算子を使用してundefinednull。例えば:

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

最後のケースは、変数が未定義かnullのどちらであるかを確認できるため、興味深いものです。

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true

1
:カイル・シンプソンは、「オブジェクト」を返すのtypeof nullがバグであると主張github.com/getify/You-Dont-Know-JS/blob/master/...
bzrk

15

スペックは、これらの質問に対する完全な回答を得るための場所です。ここに要約があります:

  1. 変数の場合x、次のことができます。

    • nullを使用して直接比較して===いるかどうかを確認してください。例:x === null
    • それはだかどうかを確認するundefinedとの直接の比較:2つの基本的な方法のいずれかによって、undefinedまたはtypeof。以下のために様々な理由、私は好みますtypeof x === "undefined"
    • それはの一つだかどうかをチェックnullし、undefined使用することによって==、平均がいることを少し難解な型強制規則に頼ってx == null正確に何をしたいん。

  2. 基本的な違い==とは、===オペランドのタイプが異なる場合は、ということです===常に返されfalseながら==使用して、同じ型に一方または両方のオペランドを変換するルールをリードいくつかのわずか直感的行動にいること。オペランドが同じ型(たとえば、typeof上記の比較のように両方が文字列である)で==あり、===まったく同じように動作する場合。

もっと読む:


9

変数がnullまたは未定義かどうかを確認するにはどうすればよいですか

変数に次のような有効な値があるかどうかを確認してください:

if(variable)

変数に以下が含まれていない場合はtrueを返します。

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

8

未定義

これは、変数がまだ初期化されていないことを意味します。

例:

var x;
if(x){ //you can check like this
   //code.
}

等しい(==)

値が等しいかどうかだけがデータ型ではないことを確認します。

例:

var x = true;
var y = new Boolean(true);
x == y ; //returns true

値だけをチェックするからです。

厳密に等しい(===)

値とデータ型が同じであることを確認します。

例:

var x = true;
var y = new Boolean(true);
x===y; //returns false.

データ型をチェックするため、xはプリミティブ型であり、yはブールオブジェクトです。


4

広告1. nullグローバルオブジェクトのプロパティの識別子ではない、などのundefined ことができます

広告2. ===チェックの値とタイプ。==いけない(使用して比較する前に、同じ種類と作られた暗黙的な変換を必要と.valueOf()して.toString())。ここにすべてがあります(src):

もし

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

==(その否定!=

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

===(その否定!==

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


1
その言及する価値があるdocument.all == nulldocument.all !== null
ユーザー

1

(論理的)チェックが否定(!)であり、JSをキャプチャしたい場合 (nullおよびundefined異なるブラウザーでは異なる結果が得られるため)、制限の少ない比較を使用します。例:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

これは両方をキャプチャnullしますundefined


0

別のロジックでお試しください。not null、空白、未定義、ゼロでないなど、検証の4つすべての条件をチェックするために次のコードを使用できます。JavaScriptとjqueryでこのコード(!(!(variable)))を使用するだけです。

function myFunction() {
var data;  //The Values can be like as null, blank, undefined, zero you can test

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

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