未定義
表現の未定義の種類が定義されていない、それは、値の一種類のみが未定義です。
値が割り当てられる前に定義されていませんが、JavaScriptエンジンでは、変数ではなく、キーワードで定義されていない任意の変数。古いブラウザでは、未定義のグローバル変数をオーバーライドすることができます。
/**
* IE8 浏览器
*/
var value;
console.log(value === undefined); //true
// 重写 undefined
undefined = 'hi';
console.log(value === undefined); //false
未定義の未定義の非値は、正しく変数が割り当てられているかどうかを検出するために使用することができない場合は、古いブラウザを書き換えるの下で、上記の例から見ることができます。
この問題はECMAScript 5は、ブラウザ内で実行されているのECMAScript 5の仕様次のコードの実現には、修復されました。
/**
* Chrome 浏览器
*/
Object.getOwnPropertyDescriptor(window, undefined); //运行结果:{"writable":false,"enumerable":false,"configurable":false}
結果は、書き込み可能なグローバル変数未定義のプロパティが書き込み可能ではない偽であり、上記の動作から分かります。
空隙
与えられた式の空隙オペレータは、評価された結果は無視され、常にundefinedを返します。
var value1 = 'hi';
console.log(value1); //"hi"
var value2 = void 'hi';
console.log(value2); //undefined
したがって、我々は正確に未定義の期待値を取得するためにこれを使用することができます。
var value;
console.log(value === void 0); //true
console.log(value === void(0)); //true
遂に
以上の試験結果から、いくつかのプログラミング仕様の使用void 0
の代わりに未定義のは、主に持ち込ま未定義の値を上書きされる危険性を避けるために。最近のブラウザ、未定義のグローバル変数を使用すると、古いブラウザとの互換性が考慮されていない場合、この問題はあまりにも心配ではないでしょう、書き込み可能ではありません。
スプレッド
未定義の問題のために取引をするために私たちを助けている多くのJavaScript圧縮ツール。
/**
* 源码
*/
var value;
console.log(value === undefined);
/**
* 使用 uglify 压缩
*/
"use strict";var value;console.log(void 0===value);