JavaScriptのundefinedとnullの違いを詳しく説明します。


ちょっとおかしいのは、JavaScript言語には「無」を表す二つの値があります。undefinedとnull。なぜですか?
一、類似性はJavaScriptにおいて、一つの変数の割り当て値をundefinedまたはnullとし、正直に言って、ほとんど区別がない。

var a = undefined;
var a = null;
上のコードの中で、a変数はそれぞれundefinedとnullに割り当てられています。この2つの書き方はほぼ等価です。undefinedと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

上のコードで説明していますが、両者の行為はどれほど似ていますか?undefinedとnullの意味と使い方は同じですが、なぜこの二つの値を同時に設定するのですか?これは無端にJavaScriptの複雑さを増やして、初心者を困らせるのではないですか?Google社が開発したJavaScript言語の代替品であるDart言語は、nullのみでundefinedがないことを明確に規定しています。二、歴史的な理由最近、私は新書『Speaking JavaScript』を読んでいますが、意外にこの問題の答えを見つけました。もともと、これはJavaScriptの歴史と関係があります。1995年にJavaScriptが誕生した時、最初はJavaのようにnullだけを「無」を示す値として設定しました。C言語の伝統によって、nullは自動的に0になるように設計されています。

Number(null)
// 0

5 + null
// 5

しかし、JavaScriptのデザイナーのBrendan Eichは、このようにするのがまだ足りないと思います。二つの原因があります。まず、nullはJavaにいるように対象とされます。

typeof null
// "object"
しかし、JavaScriptのデータの種類は元のタイプと合成タイプの2種類に分けられています。Brendan Eichは「無」を示す値が対象ではない方がいいと思います。第二に、JavaScriptの最初のバージョンにはエラー処理のメカニズムが含まれていません。データのタイプが一致しない場合、自動的にタイプを変換したり、黙って失敗したりします。Brendan Eichは、nullが自動的に0になると、エラーを見つけにくいと感じています。そのため、Brendan Eichはundefinedを設計しました。三、最初にJavaScriptを設計した最初のバージョンはこのように区別されています。nullは「無」を表す対象で、数値になると0です。undefinedは「なし」を表す元の値で、数値に変換するとNaNとなります。

Number(undefined)
// NaN

5 + undefined
// NaN

四、現在の用法ですが、上のような区別は、実践の中ですぐに実行できないと証明されます。現在、nullとundefinedは基本的に同じ意味で、わずかな違いしかありません。nullは「対象がない」という意味で、そこに値があるべきではない。典型的な使い方は、(1)関数のパラメータとして、この関数を表すパラメータがオブジェクトではないことです。2)対象のプロトタイプチェーンの終点とします。

Object.getPrototypeOf(Object.prototype)
// null
undefinedは「不足値」を表しています。ここに値があるべきですが、まだ定義されていません。典型的な使い方は:(1)変数が宣言されていますが、値が与えられていない場合はundefinedに等しいです。2)関数を呼び出した時に提供すべきパラメータが提供されていません。このパラメータはundefinedに等しいです。3)オブジェクトには、属性が割り当てられていません。この属性の値はundefinedです。4)関数の戻り値がない場合、デフォルトはundefinedに戻ります。

var i;
i // undefined

function f(x){console.log(x)}
f() // undefined

var  o = new Object();
o.p // undefined

var x = f();
x // undefined