私はJavaScriptを数年間使用していて、以前はnull
とundefined
の違いを気にしませんでした。オブジェクトの存在を検証するために、常に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を返すかはわかりません。誰かが私を明確にすることができますか?.
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値とほとんど同じように機能します。上記のいずれにも該当しません。
<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>
変数がnull値を受け取るには、変数を割り当てる必要があります。 null
は、不明な値またはドントケア値を示すために使用されます。一方、undefined
は、アクセスされているプロパティに値が割り当てられていないことを示すように設計されています。これはnull
とは異なります。
null
を使用すると、意図的に「これがどのような値になるべきかわからない」または「これが現在どのような値であるかは気にしない」と言っています。 undefined
のOTHは、実際には「割り当てられていないこの値を使用する必要がありますか」と言っています。
私がそれらを区別する方法は、「私はこの値を定義していません」である未定義であり、nullは「私はこの値を定義しましたが、値がどうあるべきかわからないか理解できない」です。