ほとんどのコンピューター言語には、C 言語の NULL、Java 言語の null、Python 言語の None、Ruby 言語の nil など、「なし」を表す値が 1 つだけあります。
少し不思議なことに、JavaScript 言語には、実際には「なし」を表す 2 つの値 (未定義と null) があります。何故ですか?
1. 類似性
JavaScript では、正直に言うと、変数を未定義または null に代入してもほとんど違いはありません。
var a = undefined; var a = null;
上記のコードでは、変数 a にそれぞれ未定義と null を代入していますが、この 2 つの書き方はほぼ同等です。
未定義と null は if ステートメントで自動的に false に変換され、等価演算子はそれらが等しいことを直接報告します。
if (!undefined) console.log('undefined is false'); // undefined is false if (!null) console.log('null is false'); // null is false undefined == null // true
上記のコードは、2 つの動作がいかに似ているかを示しています。
未定義と null の意味と使い方は似ているのに、なぜこのような値を 2 つ同時に設定する必要があるのでしょうか?これは理由もなく JavaScript を複雑にし、初心者を悩ませませんか? Google が開発した JavaScript 言語の代替である Dart 言語では、null のみが存在し、未定義は存在しないと明確に規定されています。
2. 歴史的理由
最近、新しい本「Speaking JavaScript」を読んでいたとき、偶然この質問に対する答えを発見しました。
どうやら、これは JavaScript の歴史に関係しているようです。 1995年にJavaScriptが誕生したとき、当初はJavaと同様に「何もない」を表す値としてnullのみが設定されていました。
C 言語の伝統に従って、null は自動的に 0 に変換されるように設計されています。
Number(null) // 0 5 + null // 5
しかし、JavaScript デザイナーの Brendan Aich は、2 つの理由から、これでは十分ではないと感じています。
まず、null は Java と同じようにオブジェクトとして扱われます。ただし、JavaScript のデータ型は、プリミティブ型 (プリミティブ) と複合型 (コンプレックス) の 2 つのカテゴリに分類されます。ブレンダン アイヒ氏は、「なし」を表す値はオブジェクトではない方がよいと考えています。
第 2 に、JavaScript の初期バージョンにはエラー処理メカニズムが含まれておらず、データ型の不一致が発生すると、型が自動的に変換されるか、警告なしに失敗することがよくあります。 Brendan Eich は、null が自動的に 0 に変換されると、エラーを見つけるのが難しくなると感じています。
そこで、ブレンダン・アイヒは別の未定義のものをデザインしました。
3. 初期デザイン
元のバージョンの JavaScript は次のように区別されます: null は「なし」を表すオブジェクトであり、数値に変換すると 0 になります。未定義は「なし」を表すプリミティブ値で、数値に変換すると NaN になります。 。
Number(undefined) // NaN 5 + undefined // NaN
4. 現在の使用状況
しかし、上記の区別は実際には不可能であることがすぐに判明しました。現在、null と unknown は基本的に同義ですが、いくつかの微妙な違いがあるだけです。
null は「オブジェクトがない」ことを意味します。つまり、そこに値があってはなりません。一般的な使用法は次のとおりです:
(1) 関数のパラメータとしては、関数のパラメータがオブジェクトではないことを意味します。
(2) オブジェクト プロトタイプ チェーンの終点として。
Object.getPrototypeOf(Object.prototype) // null
未定義は「値が欠落している」ことを意味します。つまり、ここには値があるはずですが、まだ定義されていません。一般的な使用法は次のとおりです:
(1) 変数が宣言されていても値が割り当てられていない場合、その変数は未定義と同じになります。
(2) 関数呼び出し時に、提供されるべきパラメータが提供されず、パラメータが未定義に等しい。
(3) オブジェクトには属性が割り当てられておらず、この属性の値は未定義です。
(4) 関数が値を返さない場合は、デフォルトで未定義を返します。
var i; i // undefined function f(x){console.log(x)} f() // undefined var o = new Object(); o.p // undefined var x = f(); x // undefined
以下は簡単な概要です
null は、非オブジェクトを表す JavaScript キーワードです。
未定義は値がないことを意味し、値が存在しないか初期化されていないことを示します。
同一性 | 相違点 |
独自の型の一意の値 | null はオブジェクト、未定義は予約語です |
プロパティとメソッドはありません | 算術演算に参加する場合、null は 0 に変換され、算術演算中に未定義を変換したり、NaN に変換したりすることはできません |
== は等しいとみなされ、=== は等しくないとみなされます | null !==未定義 //true |
はすべて false 値であり、ブール変数は同じ値を表します |
null は空のオブジェクト、未定義はウィンドウのプロパティです (オブジェクトのプロパティではありません) |
alert(typeof null) // オブジェクト ; alert(typeof unknown) // 未定義 ; |