ホームページ > ウェブフロントエンド > jsチュートリアル > 未定義と null の違いを詳しく説明する

未定義と null の違いを詳しく説明する

韦小宝
リリース: 2018-03-14 14:56:08
オリジナル
1628 人が閲覧しました

この記事では、未定義と null の違いについて説明します。未定義と null の違いがわからない場合、または未定義と null の違いに興味がある場合は、この記事を見てみましょう。そして本題に入ります

ほとんどのコンピューター言語には、C 言語の NULL、Java 言語の null、Python 言語の None、Ruby 言語の nil など、「なし」を表す値が 1 つだけあります。

少し奇妙なことに、JavaScript 言語には、実際には「なし」を表す 2 つの値があります: unknown と null。何故ですか?

1. 類似性

JavaScriptでは、変数にunknownとnullを代入するのは、正直言ってほとんど違いがありません。

var a = undefined;
var a = null;
ログイン後にコピー

上記のコードでは、変数にそれぞれ unfine と 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 の設計者であるブレンダン・アイヒ氏は、2 つの理由から、これでは十分ではないと感じています。

まず、nullはJavaと同じようにオブジェクトとして扱われます。ただし、JavaScript の

データ型は、プリミティブ型 (プリミティブ) と複合型 (コンプレックス) の 2 つのカテゴリに分類されます。Brendan Aich は、「なし」を表す値はオブジェクトではない方がよいと考えています。

第 2 に、JavaScript の初期バージョンには

エラー処理 メカニズムが含まれておらず、データ型の不一致が発生すると、多くの場合、型が自動的に変換されるか、警告なしに失敗します。 Brendan Aich は、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
ログイン後にコピー
以上がこの記事の内容です。あまり詳しくなくても、両方とも自分で簡単にマスターできます。



関連する推奨事項:

JavaScript について_02_未定義および null_JavaScript スキルを理解する

以上が未定義と null の違いを詳しく説明するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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