爲何有的編程規範要求用 void 0 代替 undefined

Undefined

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

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);

參考文檔

相關文章
相關標籤/搜索