今天從新來認識一下 JavaScript 基本數據類型中的 undefined。javascript
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 實際上是一個全局對象的屬性也就是一個全局變量,既然是一個變量理論上咱們就能夠修改它的值。下面咱們來嘗試 修改一下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)) {
// ...
}
複製代碼
最後簡單總結一下: