JavaScriptのNullとUndefindの深淵

5022 ワード


探究JavaScript的Null和Undefind的深渊


JavaScriptの元のデータ型について議論すると、String、NumberからBooleanまで、多くの人が知っている基本的な知識があります.これらの元のタイプはかなり簡単で、行動は常識に合っています.しかし,本稿では,独自の元のデータ型NullとUndefindに焦点を当て,何が彼らをこのように似ているのか,似ているようではない.

NullとUndefindの理解


JavaScriptではnullは文字通りの量であり、言語のキーワードでもあり、認識できないオブジェクト値を表すために使用されます.すなわち、これは「無値(no value)」を表すために用いられる.同様であるが、undefinedは実際には存在しない値(non-existence of a value)を表す.いずれも完全に可変であり、属性と方法がなく、属性に値を割り当てることもできません.実際、プロパティにアクセスまたは定義しようとすると、タイプエラーが発生します.彼らの名前が示すように、彼らは完全に無効な値です.
値が表すブール値はfalseであり、if文などの条件コンテキストでfalseとして計算されることを意味します.等しいオペレータ(==)を使用して、この2つの値と他のfalse値を比較します.これらの値は、自分以外のものではありません.
null == 0; // false

undefined == ""; // false

null == false; // false

undefined == false; // false

null == undefined; // true

それでもnullとundefinedは他の類似点と等価ではない.それぞれが独自のタイプの一意のメンバーとしてundefinedがUndefinedタイプでnullがNullタイプです.この2つの値は、すべてのオペレータ(===)を使用して比較されます.これは、タイプと値が等しいことを示します.
undefined === null; // false

これは重要な違いであり、異なる目的と理由に奉仕している.この2つの値を区別すると、undefinedは予想外の値なしを表し、nullは予想される値なしの代表として考えられる.

Undefindの生成


undefined値のコードを生成する方法はたくさんあります.通常、存在しない値にアクセスしようとすると発生します.この場合、JavaScriptという動的な弱い言語では、エラーに上昇するのではなくundefined値がデフォルトで返されます.
変数を宣言するときに初期値が指定されていない場合は、
undefinedのデフォルト値:
 
var foo; //      undefined

存在しないオブジェクト属性または配列アイテムにアクセスしようとすると、undefined値が返されます.
var array = [1, 2, 3];

var foo = array.foo; // foo      ,    undefined

var item = array[5]; //         5  ,   undefined

関数の戻り文を省略した場合はundefinedを返します.
var value = (function(){})(); //    undefined

関数呼び出し時に指定されていない値の結果はundefinedパラメータの値になります.
(function(undefined){

    //     undefined

})();

voidオペレータはundefined値を返すこともできます.Underscoreのようなライブラリは、可変であるため、undefinedを任意のコンテキスト依存で返すことができる防御型のチェックとして使用されます.
function isUndefined(obj){

    return obj === void 0;

}

最後に、undefinedはnullキーとは異なる事前定義されたグローバル変数をundefined値に初期化します.
'undefined' in window; // true

ECMAScript 5では,この変数は読み取り専用であり,以前はそうではなかった.

Nullの使用例


nullの例はundefinedのようにnullがより役に立つと考えられているため、彼を差別化する主な面である.これは、typeofオペレータがnull値に作用したときに「object」を返す理由です.最初の理由は、現在も、プレースホルダのように空の参照空のオブジェクトの予想として一般的に使用されているからです.typeofのこのような挙動は誤りとして確認されたが,修正が提案されたが,後互換性の目的でこの点は変わらなかった.
JavaScript環境でnullという値が設定されていない理由です.プログラミングで完了する必要があります.ドキュメントMDNで説明したように、
apiではnullはオブジェクトを頻繁に検索する場所として予想されるが,関連するオブジェクトはない.
これはDOMに適しており、言語から独立しており、ECMAScript仕様の範囲ではありません.外部APIであるため、undefinedではなくnull値を返す存在しない要素を取得しようとします.
一般的に、変数や属性に不変の値を指定したり、関数に渡したり、関数からnullを返したりする必要がある場合は、nullはほとんど最適です.簡単に言えば、JavaScriptはundefinedを使用し、プログラマーはnullを使用する必要があります.
nullのもう一つの実行可能な例は、参照が不要になったときに明示的に変数を無効に指定する(object=null)ことが好ましいと考えられる.null値を割り当てることで、参照を効果的にクリアし、オブジェクトが他のコードを参照していないと仮定し、ゴミ収集を指定し、回収メモリを確保します.

深く掘り下げる


nullとundefinedをブラックホールのようにするのは、彼らの行為だけでなく、JavaScript環境の内部での処理方法です.通常、他のオリジナルまたは組み込みオブジェクトと同じ関連フィーチャーを持っていないようです.
ES 5ではObject.prototype.toString法はnullとundefinedで一致することが証明された実際のタイプ検査基準となっている.
Object.prototype.toString.call(null); // [object Null]

Object.prototype.toString.call(undefined); // [object Undefined]

しかし、Object.prototype.TOStringメソッドは,nullの内部[[Class]]属性やundefinedを検索する公開構造関数ではない.ドキュメントに従って、次の手順が呼び出されます.
  • 値がundefinedの場合、「[object Undefined]」が返されます.
  • この値がnullの場合は、「[object Null]」を返します.
  • は、この値をパラメータの結果値としてOを呼び出しToObjectとして同時に渡す.
  • classは、Oの内部属性[[Class]]の値である.
  • が返した結果は、3つの文字列「[object]、[class]、[」の結果の文字列値を接続します.

  • この方法はnullまたはundefinedと他のオブジェクトが統一された機能を検出した場合、簡単な文字列戻り値を実行します.null値とundefined値に遭遇した場合、ほとんどの方法は簡単なスナップと戻りを含むため、仕様全体でこれは一般的です.実際には、それらが任意のオリジナルオブジェクトに関連付けられた内部プロパティを含むことを示す兆候はない.まるで彼らが相手ではないようだ.JavaScriptのオリジナル環境内部に実際に存在する明示的なスキームがどうなるか知りたいです.参加できる実装をもっとよく知っている人もいるかもしれません.

    結論


    これらのオリジナルオブジェクトがどんなに尋常でなくても、nullとundefinedの違いを理解し、JavaScriptの言語ベースで異なる役割を果たします.アプリケーションを突破することはできませんが、一般的には、開発とデバッグにおいて長期的に有益であることが証明されています.

    訳者注