nullがオブジェクトである理由と、nullとundefinedの違いは何ですか?


866

JavaScriptでとnull見なされるのobjectはなぜですか?

チェックしています

if ( object == null )
      Do something

と同じ

if ( !object )
      Do something

そしてまた:

違いは何であるnullとはundefined


6
タイトルに最後の質問が追加されているといいですね。ここでの回答は素晴らしいですが、タイトルはこの回答がここで見つかることを示していない可能性があります
marcos.borunda

6
NullはJavaScriptのオブジェクトではありません!typeof null === 'object'しかしそれはバグです!ここにリンクがありますすべてのビデオを見て楽しんでください:)
CoR

1
C / C ++は、非常に単純なので、未定義でNULL値の変数が何であるかを公理的に真実として使用するのが好きです。次に、それらの定義が他の言語の仕様とどのように比較されるかを確認します。
samis 2016

回答:


1488
(name is undefined)

あなた:nameですか?(*)
はJavaScript: name?って何name?私はあなたが何を話しているのか分かりません。これまでに言及したことはありませんname。(クライアント)側で他のスクリプト言語を見ていますか?

name = null;

あなた:nameですか?
JavaScript:わかりません。

要するに; undefined物事の概念が存在しない場所です。タイプはなく、そのスコープ内で以前に参照されたことはありません。null物が存在することがわかっている場所ですが、値が何であるかは不明です。

覚えておくべき一つのことは、つまりnull、概念的には、ないと同じfalseか、""すなわち、それらは型キャストの後に同一視しても、あるいは、

name = false;

あなた:nameですか?
JavaScript:ブール値false。

name = '';

あなた:nameですか?
JavaScript:空の文字列


*:nameこのコンテキストでは、定義されたことのない変数を意味します。未定義の変数でもかまいませんが、名前は、ほぼすべてのHTMLフォーム要素のプロパティです。それはずっと前に進み、idのかなり前に制定されました。IDは一意である必要がありますが、名前は一意である必要がないため、これは便利です。


14
しかしJavaScriptでは、空の文字列 ''はまだブール偽です。
Andreas Grech

117
空の文字列はブール値のfalseではありませんが、条件付きのコンテキストではfalse(y)値(強制)として解釈されます。
ブライアンマシューズ

22
2番目のケースでは、name = nullの場合、「わからない」の代わりに、JavaScriptは答えることができます:nullオブジェクト。それ以外は私は答えのスタイルが好きです。
Jean Vincent

16
「わからない」ではなく、null「何もない」と答えます。Nullは値なしとして正確に定義されています。ボイド、ニル、ナダ。何もない。
mikl 2011

50
その答えのスタイルが大好きです。一般的に、「これまでに言及したことがない name 」というのは本当です。ただし、値を割り当てずに変数を宣言すると(var somevar;)、驚くほど十分な結果が得られundefinedます。
MC皇帝、

142

違いはこのスニペットに要約できます:

alert(typeof(null));      // object
alert(typeof(undefined)); // undefined

alert(null !== undefined) //true
alert(null == undefined)  //true

チェック中

object == null確認は異なりif ( !object )ます。

! Boolean(object)単項!演算子は右側のオペランドをブール値に自動的にキャストするため、後者はに等しくなります。

Boolean(null)次にfalseに等しいので!false === true

したがって、オブジェクトがnullではなく、 falseまたは0または""の場合、次の理由でチェックはパスします。

alert(Boolean(null)) //false
alert(Boolean(0))    //false
alert(Boolean(""))   //false

@kentaromiura私たちのためにJavascript noobs ...たぶん私だけ...このブール(値)構文は何ですか?ブール値にキャストしますか?
xr280xr

@ xr280xrはい、それはキャストです。String(null)キャストの別の例を見てみましょう。Number(null + 2)...のような愚かなこともできますが、すべきではありません:-)。ケンタロミウラからの素晴らしい答え。
squidbe 2013年

覚えtypeofている演算子です。記述しないのと同じ理由で、オペランドを括弧で囲みませんvar sum = 1 +(1);
アレックス、2016年

124

nullオブジェクトではなく、プリミティブ値です。たとえば、プロパティを追加することはできません。がをtypeof null返すため、時々人々はそれをオブジェクトであると誤って想定します"object"。しかし、それは実際にはバグです(ECMAScript 6で修正される可能性もあります)。

違いnullとは、undefined次のとおりです。

  • undefined:JavaScriptによって使用され、「値なし」を意味します。初期化されていない変数、欠落しているパラメーター、および不明な変数は、その値を持っています。

    > var noValueYet;
    > console.log(noValueYet);
    undefined
    
    > function foo(x) { console.log(x) }
    > foo()
    undefined
    
    > var obj = {};
    > console.log(obj.unknownProperty)
    undefined

    ただし、不明な変数にアクセスすると例外が発生します。

    > unknownVariable
    ReferenceError: unknownVariable is not defined
  • null:プログラマーが「値なし」を示すために使用します(関数のパラメーターなど)。

変数を調べる:

console.log(typeof unknownVariable === "undefined"); // true

var foo;
console.log(typeof foo === "undefined"); // true
console.log(foo === undefined); // true

var bar = null;
console.log(bar === null); // true

一般的なルールとして、JavaScriptでは常に===を使用し、==は使用しないでください(==は、予期しない結果をもたらす可能性のあるすべての種類の変換を実行ます)。チェックはx == null、それは両方のために働くので、エッジケースですnullundefined

> null == null
true
> undefined == null
true

変数に値があるかどうかを確認する一般的な方法は、変数をブール値に変換して、値があるかどうかを確認することですtrue。この変換は、ifステートメントとブール演算子によって実行されます。(「ではない」)。

function foo(param) {
    if (param) {
        // ...
    }
}
function foo(param) {
    if (! param) param = "abc";
}
function foo(param) {
    // || returns first operand that can't be converted to false
    param = param || "abc";
}

このアプローチの欠点は次の値のすべてがと評価されfalseます(例えば、上記のチェックは区別できないように注意する必要がありますので、undefined0)。

  • undefinednull
  • ブール値: false
  • 数字:+0-0NaN
  • 文字列: ""

Boolean関数として使用することで、ブール値への変換をテストできます(通常、これはコンストラクターであり、で使用されますnew)。

> Boolean(null)
false
> Boolean("")
false
> Boolean(3-3)
false
> Boolean({})
true
> Boolean([])
true

1
なぜ参照し+0、別の-0場合は別にし+0 === -0ますか?
レイノス

6
おそらく、あなたはまだ区別することができるため+0-01/+0 !== 1/-0
neo

1
この回答は、この回答にソースとしてリンクしている投稿にリンクしています...おそらくこれにリンクすることを意図していました。2ality.com/2013/10/typeof
Ricardo Tomasi

Cのように、初期化されていない変数宣言は未定義と見なされます(古いバージョンには実際に以前のプログラムデータが含まれている可能性があります)。
samis 2016

5
「しかし、それは実際にはバグです(ECMAScript 6で修正される可能性もあります)」–ソース?
Gajus 2017年

26

nullとundefinedの違いは何ですか?

プロパティが定義されていない場合、プロパティは未定義です。nullはオブジェクトです。そのタイプはオブジェクトです。nullは特別な値で、「値なし。undefinedはオブジェクトではなく、型はundefinedです。

変数を宣言してnullに設定すると、「null」と「undefined」が出力されることを除いて、動作は同じです。未定義の変数をnullと比較したり、その逆を行ったりすることもでき、条件はtrueになります。

 undefined == null
 null == undefined

詳細については、JavaScriptのnullと未定義の違いを参照してください。

そして、あなたの新しい編集で、 はい

if (object == null)  does mean the same  if(!object)

テストするときにオブジェクトがfalseの場合、彼らは両方の場合にのみ、テストするときの条件を満たして偽のではなく、真のとき

ここをチェックしてください:Javascriptの落とし穴


4
===を使用し、次にundefined!== nullを使用する必要があります:D
olliej

1
最後の部分に注意してください、間違っています私の答えを見てください;)
ケンタロミウラ

6
!objectは "object == null"と同じではありません...実際、それらはまったく異なります。!objectは、objectが0、空の文字列、ブールfalse、未定義、またはnullの場合、trueを返します。
ジェームズ

3
nullは本当にオブジェクトですか?指定した最初のリンクはtypeofによってnullをチェックしますが、typeof(null)は言語設計エラーのために「オブジェクト」と評価されます。
c4il

2
nullオブジェクトではありません。typeof null == 'object';戻って真の理由(現在、将来的に変更される可能性があり)JavaScriptで固定することができないバグのためです。
Mohamad 14

21

質問の最初の部分:

nullがJavaScriptのオブジェクトと見なされるのはなぜですか?

これは、現在修正できないJavaScriptの設計エラーです。オブジェクトではなく、nullであるか、まったくない必要があります。実際のオブジェクトを検出するとき、追加のチェック(時には忘れられる)が必要であり、バグの原因となります。

質問の後半:




if (object == null)
Do something

と同じチェックです

if (!object)
Do something

2つのチェックは、次の場合を除いて常に両方ともfalseです。

  • オブジェクトが未定義またはnullであり、両方とも真です。

  • オブジェクトはプリミティブで、0 ""、、またはfalseです。最初はfalse、2番目はtrueです。

オブジェクトがプリミティブではなく、、、のような実際のオブジェクトであるnew Number(0)場合new String("")new Boolean(false)両方のチェックは偽になります。

したがって、「オブジェクト」が実際のオブジェクトを意味すると解釈される場合、両方のチェックは常に同じです。プリミティブが許可されている場合、チェックは0 ""、、およびfalseで異なります。

のようなobject==null場合、明白でない結果がバグの原因になる可能性があります。の使用==は推奨されていません===。代わりに使用してください。

質問の3番目の部分:

また

、nullとundefinedの違いは何ですか?

JavaScriptの1つの違いは、nullはオブジェクト型であり、undefinedはundefined型であるということです。

JavaScriptではnull==undefinedtrueであり、タイプが無視された場合は等しいと見なされます。なぜ彼らはそれを決定したが、0 ""とfalseは等しくないのか、私は知らない。それは恣意的な意見のようです。

JavaScriptではnull===undefined、型はで同じでなければならないため、真ではありません===

実際には、nullとundefinedはどちらも存在しないことを表すため、同一です。したがって、0を実行します。さらに""、空のコンテナ[]ともそう{}です。多くの種類の同じものはバグのレシピです。1つのタイプか、まったくないタイプのほうが優れています。なるべく使わないようにします。

「false」、「true」、および「!」たとえば、単純化できるワームの別のバッグであり、if(!x)それif(x)だけで十分であり、trueとfalseは必要ありません。

var x値が指定されていない場合、宣言された型はundefinedですが、xがまったく宣言されていない場合と同じでなければなりません。別のバグソースは、空の何もないコンテナです。したがって、のように、一緒に宣言して定義するのが最善var x=1です。

人々は、これらのさまざまなタイプのすべてを理解しようとして、ぐるぐる回っていますが、複雑な異なる服を着ていても、同じことです。現実は

undefined===undeclared===null===0===""===[]==={}===nothing

そして、おそらくすべてが例外をスローするはずです。


8
すばらしい答えですが、[]については少し行き過ぎです:「実際には、nullとundefinedは同一です...空のコンテナ[]と{}かもしれません。」{}は、 nullの味ですが、私の直感はそうすべきではないということです。しかし、それほど論争の余地はありませ[]んが、空の配列は当然のことながら.push()関数を持っているので、[]がnullであることに対する適切な引数はありません。0.02ドル。
ruffin

11
var x = null;

xはnullとして定義されます

yは定義されていません。//定義しなかったため

if (!x)

nullはfalseと評価されます


8

nullおよびundefinedを理解する1つの方法は、それぞれがどこで発生するかを理解することです。

次の状況ではnullの戻り値が必要です。

  • DOMをクエリするメソッド

    console.log(window.document.getElementById("nonExistentElement"));
    //Prints: null
  • Ajaxリクエストから受け取ったJSONレスポンス


    {
      name: "Bob",
      address: null
    }
  • RegEx.exec

  • 流動的な状態にある新機能。以下はnullを返します。


        var proto = Object.getPrototypeOf(Object.getPrototypeOf({}));

       // But this returns undefined:

        Object.getOwnPropertyDescriptor({}, "a");

存在しない他のすべてのケースは、(@ Axelで示されるように)undefinedで示されます。次のそれぞれが「undefined」と出力します。

    var uninitalised;
    console.log(uninitalised);

    var obj = {};
    console.log(obj.nonExistent);

    function missingParam(missing){
        console.log(missing);
    }

    missingParam();

    var arr = [];
    console.log(arr.pop());        

もちろん、var unitialized = null;と書くことにした場合。またはメソッドからnullを自分で返すと、他の状況でnullが発生します。しかし、それはかなり明白なはずです。

3番目のケースは、変数にアクセスしたいが、それが宣言されているかどうかさえわからない場合です。その場合、typeofを使用して参照エラーを回避します。

if(typeof unknown !== "undefined"){
    //use unknown
}

要約すると、DOMを操作しているとき、Ajaxを扱っているとき、または特定のECMAScript 5機能を使用しているときにnullをチェックします。他のすべての場合については、完全に等しいかどうかで未定義をチェックしても安全です。

if(value === undefined){
  // stuff
}

8

JavaScriptでの多くの異なるnullチェックの比較:

http://jsfiddle.net/aaronhoffman/DdRHB/5/

// Variables to test
var myNull = null;
var myObject = {};
var myStringEmpty = "";
var myStringWhiteSpace = " ";
var myStringHello = "hello";
var myIntZero = 0;
var myIntOne = 1;
var myBoolTrue = true;
var myBoolFalse = false;
var myUndefined;

...trim...

http://aaron-hoffman.blogspot.com/2013/04/javascript-null-checking-undefined-and.html

JavaScriptヌルチェック比較チャート


1
「var myUndefined;」を実行します 変数を(タイプが不明な既知の変数として)定義しますか?
Qi Fan

6

nullとundefinedはどちらも値が等しい場合はfalseです(null == undefined):どちらもブールfalseに縮小されます。それらは同じオブジェクトではありません(null!== undefined)。

undefinedはグローバルオブジェクト(ブラウザでは「ウィンドウ」)のプロパティですが、プリミティブ型であり、オブジェクト自体ではありません。これは、初期化されていない変数および関数がreturnステートメントなしで終了する場合のデフォルト値です。

nullはObjectのインスタンスです。nullは、空の結果を示すためにコレクションオブジェクトを返すDOMメソッドに使用され、エラーを示さずにfalse値を提供します。


5

いくつかの精度:

nullとundefined 2つの異なる値です。1つは名前の値がないことを表し、もう1つは名前がないことを表します。


で何が起こるかはif次のとおりですif( o )

括弧o内の式が評価され、次にif括弧内の式の値が型強制されます(この場合)o

JavaScriptの偽(強制的にfalseになる)値は、''、null、undefined、0、およびfalseです。


5

答えに追加するには、間differrenceは何undefinednullから、JavaScriptのDefinitive Guideの第6版、このページのP.41

undefinedシステムレベル、予期しない、またはエラーのような値のnull不在を表すこと、およびプログラムレベル、通常、または予期される値の欠如を表すことを検討する場合があります。これらの値の1つを変数またはプロパティに割り当てるか、これらの値の1つを関数に渡す必要がある場合nullは、ほとんどの場合、これが正しい選択です。


3

nullオブジェクトです。そのタイプはnullです。undefinedオブジェクトではありません。そのタイプは未定義です。


11
間違った-の両方nullundefinedプリミティブ値です- typeof null === 'object'言語のバグである、なぜならObject(null) !== null
クリストフ

いいえ、違います。Object()はその方法で作業をキャストします。ecma -international.org/ publications / files / ECMA -ST / Ecma -262.pdf-15.2.2.1 new Object([value])を参照してください... 8.(引数の値が指定されなかったか、そのタイプがNullまたはUndefinedでした。)新しいネイティブECMAScriptオブジェクトを作成します。新しく構築されたオブジェクトの[[Prototype]]プロパティは、Objectプロトタイプオブジェクトに設定されます。新しく構築されたオブジェクトの[[Class]]プロパティは「Object」に設定されます。新しく構築されたオブジェクトには、[[Value]]プロパティがありません。新しく作成されたネイティブオブジェクトを返します。
ケンタロミウラ2009

3
@クリストフ:つまり、あなたは正しいです。null 型である必要があります。つまり、次の理由でそれをチェックできないということです。alert(new Object()!== new Object()); / * true、新しいistanceは同じではありません/ alert(Object(null) .constructor == {} .constructor); /仕様のようにtrue / alert(Object(null).prototype == {} .prototype); /仕様のようにtrue / alert(null instanceof Object); /明らかにfalse、nullはインスタンス化されないことを意味します* /しかし、基本的にはスペックバグXDです:uselesspickles.com/blog/2006/06/12/…および javascript.crockford.com/remedial.html
kentaromiura

2

次の関数は、理由を示し、違いを解決することができます。

function test() {
        var myObj = {};
        console.log(myObj.myProperty);
        myObj.myProperty = null;
        console.log(myObj.myProperty);
}

あなたが呼ぶなら

test();

あなたは得ています

未定義

ヌル

最初console.log(...)はまだ定義されていないときに取得しようとするためmyPropertymyObj「未定義」に戻ります。nullを割り当てた後、2番目console.log(...)myProperty存在するため明らかに「null」を返しますが、値はnull割り当てられています。

この違いをクエリできるようにするために、JavaScriptには次のような特徴がnullありundefinedます。:nullが-他の言語と同様に、オブジェクトは使用undefinedできませnullん。


2

たとえば、window.someWeirdProperty未定義なので、

"window.someWeirdProperty === null" 一方、falseと評価されます

"window.someWeirdProperty === undefined" trueと評価されます。

またcheckifはif (!o)チェックと同じではないif (o == null)ためoですfalse


次の2つの条件の違いを詳しく説明することができます
ラーフル

私の答えを読んで、彼はoが0、falseまたは ""に等しい場合、ブール値はfalseであることを意味します。varundef、various = [0、 ""、null、false、undef]; for(var obj in various){alert(!obj); // 4回IEでfalse、5回でFF;)}
ケンタロミウラ2009

2

undefinedと比較したnullのもう1つの楽しい点は、インクリメントできることです。

x = undefined
x++
y = null
y++
console.log(x) // NaN
console.log(y) // 0

これは、カウンターのデフォルトの数値を設定するのに役立ちます。宣言で変数を-1に何回設定しましたか?


2

ではJavascriptが nullないobjectことがあるタイプprimitaveタイプ。

違いはなんですか? 未定義とは、設定されていないポインターを指します。 nullはnullポインタを参照します。たとえば、何かが手動で変数をタイプに設定しましたnull


2

これを見てください:

   <script>
function f(a){
  alert(typeof(a));
  if (a==null) alert('null');
  a?alert(true):alert(false);
}
</script>
                                          //return:
<button onclick="f()">nothing</button>    //undefined    null    false
<button onclick="f(null)">null</button>   //object       null    false
<button onclick="f('')">empty</button>    //string               false
<button onclick="f(0)">zero</button>      //number               false
<button onclick="f(1)">int</button>       //number               true
<button onclick="f('x')">str</button>     //string               true

1

Nicholas C. Zakasによる「The Principles of Object-Oriented Javascript」より

しかし、なぜ型がnullのときにオブジェクトなのでしょうか。(実際、これはJavaScriptを設計および保守する委員会であるTC39によってエラーとして認められています。nullが空のオブジェクトポインターであり、「オブジェクト」が論理的な戻り値になると考えられるかもしれませんが、それでも混乱します。)

ザカス、ニコラスC(2014-02-07)。オブジェクト指向JavaScriptの原則(Kindleロケーション226-227)。デンプンプレスなし。キンドル版。

それは言った:

var game = null; //typeof(game) is "object"

game.score = 100;//null is not an object, what the heck!?
game instanceof Object; //false, so it's not an instance but it's type is object
//let's make this primitive variable an object;
game = {}; 
typeof(game);//it is an object
game instanceof Object; //true, yay!!!
game.score = 100;

未定義のケース:

var score; //at this point 'score' is undefined
typeof(score); //'undefined'
var score.player = "felix"; //'undefined' is not an object
score instanceof Object; //false, oh I already knew that.

1

「null」について考える最良の方法は、データベースで同様の概念がどのように使用されているかを思い出すことです。これは、フィールドに「値がまったくない」ことを示しています。

  • はい、アイテムの値はわかっています。それが「が定義されて」。初期化されいます。
  • アイテムの値は、「値がありません」です。

これは、デバッグがより簡単なプログラムを作成するのに非常に役立つテクニックです。「未定義」の変数はバグの結果である可能性があります... (どうやって知っていますか?) ...しかし、変数に値「null」が含まれている場合、「このプログラムのどこかで、次のように設定します。 'null。' "したがって、変数の値を削除する必要がある場合は、「削除」しないでください。「null」に設定してください。古い値は孤立し、まもなくガベージコレクションされます。新しい値は、「値はありません(現在)」です。どちらの場合も、変数の状態は確かです。


1
  1. 未定義とは、変数は宣言されているが値が割り当てられていないことを意味しますが、「値なし」を表す変数にNullを割り当てることができます。(Nullは代入演算子です)

2.Undefinedはそれ自体が型であり、Nullはオブジェクトです。

3.Javascript自体は、未割り当ての変数を未定義に初期化できますが、変数の値をnullに設定することはできません。これはプログラムで行う必要があります。

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