在閱讀一些框架源碼時,發現都是用的 void 0 代替 undefined,簡單的 Google 了一下:安全
void 運算符 對給定的表達式進行求值,而後返回 undefined。框架
void 0; // undefined void ('0'); // undefined void "hello world"; // undefined void function (){return 'foo'}() // undefined
咱們常常會寫以下判斷code
if (foo === undefined) { foo = 'foo' }
嚴格上來講這樣的代碼是不安全的,咱們默認假設了 undefined 的值沒有改動過。由於 undefined 不是 JavaScript 的保留字,只是全局變量上的一個屬性,屬性值是原始值 undefined。在 ECMAScript 5 以前,給 window.undefined 賦值會覆蓋該屬性。從 ECMAScript 5 開始undefined 是一個不能被配置(non-configurable),不能被重寫(non-writable)的屬性。ip
Object.getOwnPropertyDescriptor(window, 'undefined'); /* { value: undefined, writable: false, enumerable: false, configurable: false } */
可是因爲 undefined 不是保留字,依然能夠在局部做用域中聲明一個 undefined 的變量,並改變它的值。作用域
function foo () { let undefined = 'hello world'; return function (v) { return v === undefined; } } let isUndefined = foo(); let bar; isUndefined(bar); // false isUndefined(undefined); // false isUndefined('hello world'); // true
一種是能夠用 typeof,對於原始值 undefined , typeof 始終返回字符串 'undefined'字符串
function foo () { let undefined = 'hello world'; return function (v) { return typeof v === 'undefined'; } } let isUndefined = foo(); let bar; isUndefined(bar); // true isUndefined(undefined); // true isUndefined('hello world'); // false
另一種就是 void 運算符,void 運算符始終返回原始值 undefinedget
function foo () { let undefined = 'hello world'; return function (v) { return v === void 0; } } let isUndefined = foo(); let bar; isUndefined(bar); // true isUndefined(undefined); // true isUndefined('hello world'); // false
固然,與 void 'hello world' 比較也是能夠的,可是 void 0 字符數更短,寫起來比 typeof 方便。由於框架代碼不知道本身的執行上下文,也就不能假定 undefined 標識有沒有被從新賦值過,因此用 void 0 來判斷是否是原始值。源碼