web-dev-qa-db-ja.com

JavaScriptがnullとundefinedを返すのはいつですか?

私はJavaScriptを数年間使用していて、以前はnullundefinedの違いを気にしませんでした。オブジェクトの存在を検証するために、常にundefinedを使用します。

しかし、最近私は この記事 を通り抜けました。ここで彼らは言った

JavaScriptは、意図的な非値を示す「object」タイプのオブジェクトであるnullと、初期化されていない値を示す「undefined」タイプのオブジェクトであるundefinedを区別します。つまり、値はまだ設定されていません。まだ割り当てられています。変数については後で説明しますが、JavaScriptでは、値を割り当てずに変数を宣言することができます。これを行うと、変数の型は未定義になります。

私は今完全に混乱しています、ここで価値がないのは正確には何ですか。この非値がundefinedとどのように異なるか。そして、javascriptがnullを返す状況は何ですか。

以下のサンプルを試しました

var sam;
alert(sam);  // returns undefined

そして

try {
    //var sam;
    alert(sam);  
} catch(ex) { }   // exception says: sam is undefined

そして、jsがいつnullを返すかはわかりません。誰かが私を明確にすることができますか?.

18
RameshVel

alert(sam); //未定義を返します

いいえ、それは例外です。

未設定のプロパティにアクセスすると、undefinedを取得します。未設定の名前を直接使用すると、エラーが発生します。

グローバル変数は、単純な変数名を使用するか、windowグローバルオブジェクトのプロパティを使用してアクセスできるため、興味深いものです。

alert(window.sam);      // undefined
alert(window['sam']);   // undefined
alert('sam' in window); // false
alert(sam);             // ERROR

samが宣言されているが初期化されていない場合でも、window.samにアクセスするとundefinedが取得されますが、別の理由でwindowオブジェクトにsamのエントリがありますが、アクセスしたときに取得するのと同じundefinedオブジェクトを指します。存在しないプロパティ。

var sam;
alert(window.sam);      // undefined
alert(window['sam']);   // undefined
alert('sam' in window); // ** true
alert(sam);             // ** undefined

もちろん、これは紛らわしい血まみれです。 undefinedは、JavaScript言語の設計における最悪の間違いの1つです。

一方、nullは問題なく、他の言語のnull/nil/void/None値とほとんど同じように機能します。上記のいずれにも該当しません。

14
bobince
<script type="text/javascript">
// variable with an unasigned value
var a;
if (a == undefined) {
  alert('a is undefined');
}

if (a == null) {
  alert('a is undefined');
}

// this will produce an error
if (b == undefined) {
  alert('b is undefined');
}

// this is the right way to handle not defined variables
if (typeof(c) == 'undefined') {
  alert('c is blabla');
}
</script>
2
Robert Cabri

変数がnull値を受け取るには、変数を割り当てる必要があります。 nullは、不明な値またはドントケア値を示すために使用されます。一方、undefinedは、アクセスされているプロパティに値が割り当てられていないことを示すように設計されています。これはnullとは異なります。

nullを使用すると、意図的に「これがどのような値になるべきかわからない」または「これが現在どのような値であるかは気にしない」と言っています。 undefinedのOTHは、実際には「割り当てられていないこの値を使用する必要がありますか」と言っています。

2
AnthonyWJones

私がそれらを区別する方法は、「私はこの値を定義していません」である未定義であり、nullは「私はこの値を定義しましたが、値がどうあるべきかわからないか理解できない」です。

1
Tinister