ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScriptにおけるnullとunknownの違い
JavaScript 開発で、「null と unknown の違いは何ですか?」と尋ねられました。 特に未定義については、未定義の実装原則が関係するため、しばらく答えるのが難しいです。
ご存知のとおり、null == 未定義
しかし、null !== 未定義
それでは、この 2 つの違いは何でしょうか?
null
これはオブジェクトですが、空です。これはオブジェクトであるため、 typeof null は 'object' を返します。
null は JavaScript の予約キーワードです。数値演算に参加する場合、
nullの値は自動的に0に変換されます。そのため、次の式は計算後に正しい値を取得します:
Expression: 123 + null 結果の値: 123
Expression: 123 * null 結果。 value :0
未定義
未定義は、グローバルオブジェクト(ウィンドウ)の特別なプロパティであり、その値は未定義です。ただし、 typeof unknown は 'unknown' を返します。
未定義は特別な意味を持ちますが、確かにプロパティであり、グローバル オブジェクト (ウィンドウ) のプロパティです。次のコードを見てください:
alert('undefined' in window); //输出:true var anObj = {}; alert('undefined' in anObj); //输出:false
ご覧のとおり、unknown は window オブジェクトのプロパティですが、anObj オブジェクトのプロパティではありません。
注: unknown は特別な意味を持つプロパティですが、JavaScript では予約されたキーワードではありません。
未定義が数値計算に参加する場合、結果は NaN でなければなりません。
ところで、NaN はグローバル オブジェクト (ウィンドウ) のもう 1 つの特別なプロパティであり、Infinity も同様です。これらの特別な属性はいずれも JavaScript の予約キーワードではありません。
未定義のパフォーマンスの向上
プログラム内で未定義の値を使用する場合、実際にはウィンドウオブジェクトの未定義プロパティを使用します。
同様に、変数を定義しても初期値を割り当てない場合、たとえば:
var aValue;
このとき、JavaScript はその初期値を window.unknown プロパティへの参照に設定します。プリコンパイルと呼ばれます。
そのため、変数または値を未定義と比較する場合、実際にはウィンドウ オブジェクトの未定義プロパティと比較されます。この比較プロセス中に、JavaScript はウィンドウ オブジェクトの「unknown」という名前のプロパティを検索し、2 つのオペランドの参照ポインタを比較して、それらが同じかどうかを確認します。
windowオブジェクトは多くの属性値を持っているため、unknownとの比較のたびにwindowオブジェクトの未定義属性を探すのに時間がかかります。これは、未定義との頻繁な比較を必要とする関数のパフォーマンス上の問題となる可能性があります。したがって、この場合、ローカルの未定義変数を自分で定義して、未定義の比較を高速化できます。例:
function anyFunc() { var undefined; //自定义局部undefined变量 if(x == undefined) //作用域上的引用比较 while(y != undefined) //作用域上的引用比较 };
このうち、未定義のローカル変数を定義した場合、その初期値は window.unknown プロパティの値への参照となります。新しく定義されたローカル未定義変数が関数のスコープ内に存在します。後続の比較操作では、JavaScript コードの記述方法に変更はありませんが、比較速度は非常に高速です。スコープ内の変数の数はウィンドウ オブジェクトのプロパティよりもはるかに少ないため、変数の検索速度が大幅に向上します。
これが、多くのフロントエンド JS フレームワークがローカルの未定義変数を独自に定義することが多い理由です。