Undefined 類型表示未定義,它的類型只有一個值,就是 undefined。javascript
任何變量在被賦值前它的值都是 undefined,可是在 JavaScript 引擎中,undefined 是一個變量而非關鍵字。在舊的瀏覽器中,全局變量 undefined 能夠被重寫。前端
/** * IE8 瀏覽器 */ var value; console.log(value === undefined); //true // 重寫 undefined undefined = 'hi'; console.log(value === undefined); //false
從上面的例子可知,在舊的瀏覽器下若是 undefined 被重寫爲非 undefined 值,那麼它就沒法用來正確檢測一個變量是否被賦值。java
這個問題在 ECMAScript 5 中被修復了,在實現了 ECMAScript 5 規範的瀏覽器中運行如下代碼。git
/** * Chrome 瀏覽器 */ Object.getOwnPropertyDescriptor(window, undefined); //運行結果:{"writable":false,"enumerable":false,"configurable":false}
從上面的運行結果可知,全局變量 undefined 的 writable 屬性是 false,也就是不可寫。github
void 運算符對給定的表達式進行求值,會忽略計算結果並始終返回 undefined。編程
var value1 = 'hi'; console.log(value1); //"hi" var value2 = void 'hi'; console.log(value2); //undefined
所以,咱們能夠利用這一點準確地獲取預期的 undefined 值。segmentfault
var value; console.log(value === void 0); //true console.log(value === void(0)); //true
從上面的測試結果來看,有的編程規範要求使用 void 0
代替 undefined,主要緣由在於避免 undefined 值被重寫帶來的風險。現代瀏覽器中,全局變量 undefined 是不可寫的,若是不考慮兼容舊的瀏覽器,那麼這個問題就不用太過在乎。瀏覽器
許多 JavaScript 壓縮工具,已經幫助咱們針對 undefined 的這個問題作出了處理。工具
/** * 源碼 */ var value; console.log(value === undefined);
/** * 使用 uglify 壓縮 */ "use strict";var value;console.log(void 0===value);