javascript中的undefined可以被重写

问题:

为什么有的编程规范要求用 void 0 代替 undefined?

 

众所周知,当声明一个变量,并且没有给赋值的情况下,它的初始值是 undefined
但是在javascript中,怎么检查一个值是否为 undefined 呢?

在现代浏览器中,你可以安全的直接比较将变量是与 undefined 进行比较

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

一些人反对直接使用 undefined 变量进行比较,因为在旧的浏览器中它允许被重新赋值,像下面这样:

undefined = "test"

在被重新赋值后,直接使用 undefined 将不能正确的检测一个变量是否被赋值。
然而,这一行为在2009年的ECMAScript 5被修复了。

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的值。

如果你仍然很在意,有两个方法在即使全局 window.undefined 已经被重写的情况下,依然可以检查一个值是否为 undefined

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

在这个例子中 0 没有任何实际意义,你想要使用 1 or function(){}也无所谓。 void(anything)都会计算得到undefiend

另外一种选择,你可以使用typeof操作符安全地检查是否已经被赋值。你可以检查一个值的类型是否为 "undefined" 代替与全局的 undefined 比较.

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

注意第二个选择与前一个方案稍微有点差异。虽然name没有被声明,typeof 仍然会说他是 undefined。如果你直接使用 name 与 undefinedor 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方法

参考:https://segmentfault.com/a/1190000007015757

 

posted @ 2024-01-19 09:41  vickylinj  阅读(36)  评论(0编辑  收藏  举报