web-dev-qa-db-ja.com

なぜnullはオブジェクトなのか、そしてnullとundefinedの違いは何ですか?

JavaScriptでnullobjectとみなされるのはなぜですか?

チェックしています

if ( object == null )
      Do something

と同じ

if ( !object )
      Do something

そしてまた:

nullundefinedはどう違いますか?

843
rahul
(name is undefined)

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

name = null;

あなた: nameとは何ですか?
JavaScript: 知りません。

要するに; undefinedは事の概念が存在しないところです。型はなく、その範囲内でこれまでに参照されたことはありません。 nullは存在することがわかっている場所ですが、値が何であるかはわかりません。

覚えておくべき1つのことは、nullは概念的には、false""などと同じではありません。

name = false;

あなた: nameとは何ですか?
JavaScript: Booleanブール値。

name = '';

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


*:この文脈でのnameは定義されたことがない変数として意味されます。未定義の変数でもかまいません。ただし、nameはほぼすべてのHTMLフォーム要素のプロパティです。それは道を辿って行き、idの前に設立されました。 IDは一意である必要がありますが、名前は一意である必要はないため、これは便利です。

1459
Rob

違いはこのスニペットにまとめることができます:

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

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

確認中

object == nullif ( !object )をチェックするのとは異なります。

単項の!演算子は自動的に右のオペランドをブール値にキャストするので、後者は! Boolean(object)と同じです。

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

あなたのオブジェクトが nullではない だが false または 0 または "" の場合、チェックはパスします

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

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

nullundefinedの違いは次のとおりです。

  • 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では常に===を使用し、==を使用しないでください(==を実行すると あらゆる種類の変換が行われます /予期しない結果が生じる可能性があります)。 nullundefinedの両方に機能するので、x == nullのチェックはEdgeのケースです。

> 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
118

Nullと未定義の違いは何ですか?

定義がない場合のプロパティは未定義です。 nullはオブジェクトです。その型はオブジェクトです。 nullは "値がないことを意味する特別な値です。undefinedはオブジェクトではなく、型は未定義です。

あなたは変数を宣言し、それをnullに設定することができ、そしてその動作は "null"が "undefined"に対して表示されることを除いて同じです。未定義の変数とnullまたはその逆を比較することもできます。その場合、条件は真になります。

 undefined == null
 null == undefined

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

そしてあなたの新しい edit yes

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

objectがfalseかどうかをテストするとき、両方ともif false をテストするときの条件を満たすだけですが、trueのときは満たさない

ここでチェックしてください: Javascript gotcha

25
TStamper

質問の最初の部分:

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

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

質問の第二部:

チェックしています


if (object == null)
Do something

と同じ

if (!object)
Do something

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

  • objectが未定義またはnullです。両方ともtrueです。

  • objectがプリミティブで、0、""、またはfalseの場合、最初にfalse、2番目にtrueをチェックします。

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

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

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

質問の第三部:

そしてまた:

nullと未定義の違いは何ですか?

JavaScriptでは、1つの違いは、nullはオブジェクト型で、undefinedは未定義型です。

JavaScriptでは、null==undefinedはtrueで、typeが無視された場合は等しいと見なされます。なぜ彼らがそれを決めたのですが、0、""とfalseは等しくありません、私は知りません。それは恣意的な意見のようです。

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

実際には、nullと未定義は、どちらも存在しないことを表すため、同一です。そのため、0と""を実行してください。空のコンテナ[]{}も同様です。だから何も同じものの多くの種類はバグのレシピです。 1つのタイプかまったくない方が良いです。私はできるだけ使用しないようにします。

'false'、 'true'、および '!'たとえばif(!x)if(x)だけで十分です。あなたはtrueとfalseを必要としません。

値が指定されていない場合、宣言されたvar xは型未定義ですが、xがまったく宣言されていない場合と同じになります。もう1つのバグの原因は空のnothingコンテナです。ですから、var x=1のように一緒に宣言して定義するのが最善です。

人々は、これらのさまざまなタイプのものをすべて見つけようとして、輪になって回っていますが、複雑な異なる服装でもまったく同じことです。現実は

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

そして、おそらくすべてが例外を投げるべきです。

20
Anon
var x = null;

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

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

if (!x)

nullはfalseと評価されます

10
Chad Grant

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 Null Check Comparison Chart

7
Aaron Hoffman

Nullおよび未定義を理解するための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"を表示します。

    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 unitialised = nullと書くことにしたのであれば。または自分でメソッドからnullを返すと、他の状況でnullが発生することになります。しかし、それはかなり明白なはずです。

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

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

要約すると、DOMを操作しているとき、Ajaxを処理しているとき、または特定のECMAScript 5機能を使用しているときは、nullをチェックします。他のすべての場合には、未定義を厳密な等価性でチェックするのが安全です。

if(value === undefined){
  // stuff
}
7
Noel Abrahams

nullとundefinedは、値が等しい場合は両方ともfalseです(null == undefined)。両方ともfalseにブール値になります。それらは同じオブジェクトではありません(null!==未定義)。

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

nullはObjectのインスタンスです。コレクションオブジェクトを返すDOMメソッドでは空が返されることを示すためにnullが使用され、エラーを示すことなくfalseの値が返されます。

6
Anonymous

の答えに追加するには、JavaScript定義ガイド のこのページの から、undefinednullの違いは何ですか - /:

undefinedはシステムレベル、予期しない、またはエラーのような値の不在を表し、nullはプログラムレベル、通常の、または予想される値の不在を表すと考えるかもしれません。これらの値の1つを変数またはプロパティに代入するか、これらの値の1つを関数に渡す必要がある場合は、nullがほとんどの場合正しい選択です。

いくつかの精度:

nullおよび未定義2つの異なる値です。 1つは名前の値が存在しないことを表し、もう1つは名前が存在しないことを表します。


ifname__で何が起こるかは、if( o )に対して以下のようになります。

括弧oの中の式が評価され、それからifname__が括弧の中の式の値を型強制的に型指定します。ここではoname__です。

JavaScriptの偽造(それは偽に強制されるでしょう)値は次のとおりです: ''、null、未定義、0、および偽

4

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

1
Vikas

例えばwindow.someWeirdPropertyは未定義なので、

"window.someWeirdProperty === null"はfalseに評価されますが

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

さらに、checkif if (!o)は、ofalseであることについてif (o == null)をチェックするのと同じではありません。

1
Piotr Findeisen

未定義と比較してnullについてのもう一つのおもしろいことは、それが増加することができるということです。

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

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

1
Tim Scollick

これを見てください。

   <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
ZPKSoft

Javascript nullobject型ではなく、primitave型です。

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

1
AnonDCX

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

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

電話した場合

test();

あなたはなっています

undefined

ヌル

最初のconsole.log(...)は、まだ定義されていない状態でmyPropertyからmyObjを取得しようとしています - したがって、 "undefined"に戻ります。 nullを代入した後、myPropertyが存在するため、2番目のconsole.log(...)は明らかに "null"を返しますが、nullという値が割り当てられています。

この違いを調べることができるように、JavaScriptにはnullundefinedがあります。nullは - 他の言語と同じようにオブジェクトですが、undefinedはオブジェクトにできないためです。利用可能なインスタンスがありません(nullインスタンスでなくても)。

1
user3615347

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

  • はい、商品の価値はわかっています。 it'defined'です。が初期化されています。
  • "値がありません。"

これはより簡単にデバッグされるプログラムを書くのに非常に便利なテクニックです。 'undefined'変数はバグの結果である可能性があります... (どうやってわかりますか?) ...しかし、変数に 'null'という値が含まれている場合は、このプログラムでは、 それを に設定して 'null'にします。したがって、変数の値を削除する必要がある場合は、「削除」しないでください。 'nullに設定してください。 」古い値は孤立し、すぐにガベージコレクションされます。新しい値は「今は値がない」ということです。どちらの場合も、変数の状態は確実です。「明らかに、意図的に、そのようにしました。」

0
Mike Robinson

Nicholas C. Zakasによる「オブジェクト指向のJavaScriptの原理」より

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

Zakas、Nicholas C.(2014-02-07)。オブジェクト指向JavaScriptの原理(Kindle Locations 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.
0
Felix
  1. 未定義とは、変数は宣言されているが値が割り当てられていないことを意味し、Nullは「値なし」を表す変数に割り当てることができます(Nullは代入演算子です)。

2.Undefinedは型そのもので、Nullはオブジェクトです。

3.Javascriptは、割り当てられていない変数を未定義に初期化することはできますが、変数の値をnullに設定することはできません。これはプログラム的に行わなければなりません。

0