undefined 原來是這樣

今天從新來認識一下 JavaScript 基本數據類型中的 undefined。javascript

從新認識 undefined

The global undefined property represents the primitive value undefined. It is one of JavaScript's primitive types.java

全局對象的 undefined 屬性表明的值爲原始值 undefined 。同時 undefined 也是 JavaScript 中原始類型之一。在瀏覽器環境中全局對象即爲 window,也就是說 undefined 是 window 對象的一個屬性(全局做用域的一個變量),而且初始值爲 undefined。瀏覽器

undefined 值可能出現的狀況

對於 undefined 值可能出現的狀況:函數

  1. 一個沒有被賦值的變量的類型是 undefined;
  2. 方法或者是語句中操做的變量沒有被賦值,則會返回 undefined;
  3. 一個函數若是沒有使用return語句指定返回值,就會返回一個 undefined 值;

undefined 的值與判斷方法

前面有提到 undefined 實際上是一個全局對象的屬性也就是一個全局變量,既然是一個變量理論上咱們就能夠修改它的值。下面咱們來嘗試 修改一下ui

var undefined = 123;
// 在瀏覽器運行能夠看出其實,並無修改爲功;而且在嚴格模式下修改 undefined 的值會報錯;
console.log(undefined);
複製代碼

從圖中能夠看出其實,undefined 雖然做爲 window 對象的屬性可是是隻讀的,因此沒法修改。spa

在現代瀏覽器(JavaScript 1.8.5/Firefox 4+),自ECMAscript5標準以來undefined是一個不能被配置(non-configurable),不能被重寫(non-writable)的屬性。即使事實並不是如此,也要避免去重寫它。code

既然做爲全局對象沒法修改那麼做爲局部對象是否能夠修改呢?試試下面的代碼:cdn

// 不要這樣作!
// 打印 'foo string' 說明 undefined 的值和類型都已經改變
(function() {
  var undefined = 'foo';
  console.log(undefined, typeof undefined)
})()

// 打印 'foo string' 說明 undefined 的值和類型都已經改變
(function(undefined) {
  console.log(undefined, typeof undefined)
})('foo')
複製代碼

上面的示例能夠看出 undefined 不是 JavaScript 中的保留字。undefined 其實在非全局做用域中是能夠和普通變量名同樣的使用,其值是能夠被修改的。可是不推薦這樣寫,這樣容易致使咱們的代碼難以維護和排查錯誤!!!對象

既然 undefined 的值在有些狀況可能被修改,那麼咱們用下面的方式來判斷一個變量是否爲 undefined 就存在了必定的風險。blog

var name = 'foo';
if (name === undefind) {
  // ...
}
複製代碼

因此咱們不能直接經過 undefined 的變量來獲取值,能夠使用 void(0) 的方式來獲取一個 undefined 值。void 運算符是用來對給定的表達式進行求值,而後返回 undefined。這樣拿到的運算結果是一個比較準確的 undefined 值,不論 undefined 是否被修改。因此我麼的判斷方式能夠這樣:

// 方式一
var name;
if (name === void 0) {
  // ...
}

// 方式二
if(typeof name === 'undefined') {       // 沒有錯誤,執行結果爲true
   console.log('name is ' + typeof y )  // name is undefined
}

// 【推薦】判斷是否爲 undefined 是一個比較常見的操做,能夠封裝一個方法。這樣在使用的時候一方面更符合語義比較直觀,另外一方面判斷更加準確
function isUndefined(o) {
  return o === void 0;
}
var user;
if (isUndefined(user)) {
  // ...
}
複製代碼

小結

最後簡單總結一下:

  1. undefined 不是一個保留字,非全局做用域中值能夠被改變;
  2. undefined 是一個全局只讀屬性,沒法修改;
  3. 能夠經過 void 0 來獲取一個準確的 undefined 值;
  4. 一個沒有被賦值的變量的類型是 undefined;
  5. 方法或者是語句中操做的變量沒有被賦值,則會返回 undefined;
  6. 一個函數若是沒有使用return語句指定返回值,就會返回一個 undefined 值;
相關文章
相關標籤/搜索