【譯】javascript中的undefined能夠被重寫

衆所周知,當聲明一個變量,而且沒有給賦值的狀況下,它的初始值是 undefined
可是在javascript中,怎麼檢查一個值是否爲 undefined 呢?javascript

簡單的回答

在現代瀏覽器中,你能夠安全的直接比較將變量是與 undefined 進行比較java

if (name === undefined) {
    //...
}

一些人反對直接使用 undefined 變量進行比較,由於在舊的瀏覽器中它容許被從新賦值,像下面這樣:git

undefined = "test"

在被從新賦值後,直接使用 undefined 將不能正確的檢測一個變量是否被賦值。
然而,這一行爲在2009年的ECMAScript 5被修復了。github

15.1.1.3 undefined
The value of undefined is undefined (see 8.1). This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
undefined 的值是 undefined。這個屬性有不可寫不可枚舉不可配置的特性。瀏覽器

在現代瀏覽器中,undefined的值將不能被重寫安全

咱們須要支持ie8或者更古老的瀏覽器怎麼辦

一般undefined指令是安全的。在應用中並無什麼理由須要修改undefined的值。
Thomas的回答使用具備說服力的推理,論證了這一點。函數

我沒有遵從人們告訴我,我不該該使用setTimeout,由於有人能夠(這樣用):工具

window.setTimeout = function () {
    alert("Got you now!");
};

下面一行,它能夠從新定義參數,替換原始值,使 raw === undefined 看起來是假的。es5

若是你仍然很在乎,有兩個方法在即便全局 window.undefined 已經被重寫的狀況下,依然能夠檢查一個值是否爲 undefined翻譯

if (name === void(0)) {
    //...
}

在這個例子中 0 沒有任何實際意義,你想要使用 1 or function(){}也無所謂。 void(anything)都會計算獲得undefiend

另一種選擇,你可使用typeof操做符安全地檢查是否已經被賦值。你能夠檢查一個值的類型是否爲 "undefined" 代替與全局的 undefined 比較.

if (typeof name === "undefined") {
    //...
}

注意第二個選擇與前一個方案稍微有點差別。雖然name沒有被聲明,typeof 仍然會說他是 undefined。若是你直接使用 nameundefinedor void(0)你會獲得ReferenceError異常的錯誤.

可是不要直接使用void(0)

在代碼中避免使用void(0)或者 typeof x === "undefined",這些表達式不是自解釋的,應該包裝在isUndefined function函數中,像這樣:

function isUndefined(value){
    //得到undefined,保證它沒有被從新賦值
    var undefined = void(0);
    return value === undefined;
}

許多的工具庫已經部署了這個方法,例如: _.isUndefinedunderscore中的isUndefined方法

原文地址
原文標題:在javascript中怎樣檢查undefiend

初次翻譯,若有錯誤,歡迎指正

相關文章
相關標籤/搜索