用 void 0 代替 undefined

在閱讀一些框架源碼時,發現都是用的 void 0 代替 undefined,簡單的 Google 了一下:安全

void 運算符

void 運算符 對給定的表達式進行求值,而後返回 undefined。框架

void 0; // undefined
void ('0'); // undefined
void "hello world"; // undefined
void function (){return 'foo'}() // undefined

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 來判斷是否是原始值。源碼

相關文章
相關標籤/搜索