ホームページ > ウェブフロントエンド > jsチュートリアル > javascript_javascript スキルにおける未定義と null の違い

javascript_javascript スキルにおける未定義と null の違い

WBOY
リリース: 2016-05-16 15:44:47
オリジナル
1117 人が閲覧しました

ほとんどのコンピューター言語には、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) // 未定義 ;
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート