【译】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

初次翻译,若有错误,欢迎指正

相关文章
相关标签/搜索