JavaScript学習--Item 12 undefinedとnull

11226 ワード

JavaScriptの中の元のデータの種類を討論する時、大多数の人はString、NumberからBooleanまでの基本的な知識を知っています.これらの原始的なタイプはかなり簡単で、行動は常識に合っています.しかし、本論文では、ユニークな元のデータタイプNullとUnidefinedについてもっと注目したいと思います.何がそれらをこのように似ているのか、似て非なるものがありますか?
一、nullとundefinedを理解する
JavaScriptでは、nullは文字の量であり、言語のキーワードでもあり、識別できないオブジェクトの値を表しています.つまり、これは「ノーバリュー」という意味ですが、いつ期待値を得るかを決められます.
似ていますが、undefinedは実際には存在しない値を表しています.つまり、あなたがなくしたものがあります.どちらもまったく変数ではなく、属性や方法がなく、属性に値を付けることもできません.実際には、nullとundefinedの属性にアクセスしようとすると、タイプエラーが発生します.
値が表されていないブール値はfalseであり、これは彼らが条件コンテキストでif文などのfalseとして計算されることを意味する.これらの2つの値と他のfalse値を同等のオペレータ(=)で比較すると、彼らは自分以外のものとは等しくない.
null == 0; // false 
undefined == ""; // false 
null == false; // false 
undefined == false; // false 
null == undefined; // true 
それでも他と似ているところは、nullとundefinedは等価ではない.それぞれのユニークなタイプの唯一のメンバーとして、undefinedはUnidefinedタイプとnullはObjectタイプです.これらの2つの値をフルクラスのオペレータ(==)で比較します.この要求のタイプと値は同じです.以下にこの点を証明します.
null === undefined;  //false
typeof null; //"object"
typeof undefined;  //"undefined"
ここではnullは対象ですが、空いています.またnullはJavaScriptがキーワードを保持しています.
また、nullが数値演算に参加すると、その値は自動的に0に変換されますので、下記の式の計算で正しい値が得られます.
123 + null;   //123 
123 * null;   //0 
undefinedはグローバルオブジェクト(window)の特殊属性で、その値は未定義です.ただし、typeof undefinedは‘undefined’に戻ります.undefinedは特殊な意味を持っていますが、確かに属性であり、全体のオブジェクト(window)の属性です.下のコードを見てください.
alert('undefined' in window);//true 
var anObj = {}; 
alert('undefined' in anObj); //false 
ここから、undefinedはwindowオブジェクトの属性の一つですが、anObjオブジェクトの属性ではありません.注意:
  • undefinedは特別な意味を持つ属性であるが、JavaScriptの保留キーワードではない.undefinedが任意の数値計算に参加する場合、その結果はNaNに違いない.ちなみに、NaNはグローバルオブジェクトのもう一つの特殊属性で、Infinityもです.これらの特殊属性はすべてJavaScriptの保留キーワードではありません.
  • は、一つの値または一つのオブジェクトがnullであることを検証する場合、「===」だけで判定する必要があり、nullかundefinedか判定できない.
  • 二、Unidefined発生状況
    多くの方法がundefined値のコードを生成する.通常、存在しない値にアクセスしようとしたときに出会う.この場合、JavaScriptというダイナミックな弱い言語では、エラーではなくundefined値がデフォルトで戻ります.
    1、どの宣言変数も初期値を提供していません.undefinedのデフォルトがあります.
    var foo; //      undefined 
    2、存在しないオブジェクト属性または配列項目にアクセスしようとすると、undefined値を返します.
    var array = [1, 2, 3]; 
    var foo = array.foo; // foo      ,    undefined 
    var item = array[5]; //         5  ,   undefined 
    3、関数の戻り文が省略された場合、またはreturn文にはいかなるパラメータも持たずにundefinedに戻ります.
    var value = (function(){ })(); //    undefined 
    var value1 = (function(){ return; })(); //    undefined 
    4、関数を呼び出す時に提供すべきパラメータが提供されていません.このパラメータはundefinedに等しいです.
    function f(x){ console.log(x) } f(); // undefined
    最後に、undefinedは、事前に定義されたグローバル変数(nullキーとは異なり)です.undefined値に初期化されます.
    'undefined' in window; // true 
    ECMAScript 5では、この変数は読み取り専用です.以前はそうではありませんでした.
    三、nullの用例
    nullの用例は彼を違ったものにする主な方面で、undefinedと違ってnullはもっと役に立つと思われます.これは、typeofオペレータがnull値に作用したときに、「object」に戻ります.最初の理由は、現在も空のオブジェクトの参照として使用されることが多いということです.typeofのこのような挙動はエラーとして認識されましたが、修正を提出しましたが、ポスト互換性のために、この点は変更されませんでした.
    一般的に、変数や属性に不変値を指定する必要があれば、関数に伝達するか、関数からnullに戻るか、nullはほぼ常に最良の選択です.簡単に言えば、JavaScriptはundefinedを使用し、プログラマはnullを使用するべきです.
    nullのもう一つの実行可能な用例も、明示的な指定変数が無効であると考えられています.参照はもう必要ではありません.null値を割り当てることで、参照を効果的にクリアし、対象が他のコードを引用していないと仮定して、ごみ収集を指定し、メモリの回収を確保する.
    四、undefinedの性能を高める
    プログラムでundefined値を使うと、実際にはwindowオブジェクトのundefined属性が使われます.同様に、変数が定義されていますが、初期値は与えられていません.例えば、
    var aValue; 
    このとき、JavaScriptは、いわゆるプリコンパイル時に、その初期値をwindow.undefined属性への参照として設定します.そこで、変数または値をundefinedと比較すると、windowオブジェクトのundefined属性と実際に比較します.この比較の過程で、JavaScriptはwindowオブジェクトの名前を「undefined」という属性を検索して、二つの操作数の参照ポインタが同じかどうかを比較します.
    windowオブジェクトの属性値が非常に多いため、undefinedとの比較では、windowオブジェクトのundefined属性の検索に時間がかかります.undefinedと頻繁に比較する必要がある関数では、これは性能問題点になり得る.したがって、この場合、undefinedに対する比較速度を速めるために、局所的undefined変数を自己定義することができる.たとえば:
    function anyFunc() { 
        var undefined; 
        //     undefined   
        if(x == undefined) 
        //          
        while(y != undefined) 
        //          
    }; 
    ここで、undefined局所変数を定義すると、その初期値はwindow.undefined属性値の参照となります.新たに定義された局所undefined変数は、この関数の作用領域に存在する.その後の比較操作では、JavaScriptコードの書き方は何も変わりませんが、比較的速いです.作用領域の変数数はwindowオブジェクトの属性よりはるかに少ないため、検索変数の速度は非常に高くなります.
    これは多くの先端のJSフレームワークがなぜ自分で一つのローカルundefined変数を定義する必要があるのですか?