使用'var undefined'来测试undefined是否有问题?

4

这个针对未定义的测试有什么问题吗?

var undefined;

if(x == undefined){
    //do something
}

或者这个:
function undefined(x){
    return typeof x == 'undefined';
}

if(undefined(x)){
    //do something
}

jsLint并没有抛出保留字错误,但代码似乎仍然可以工作...


仅仅测试 if (typeof(x) === 'undefined') { ... } 有什么问题吗? - Tim O
@Tim O 没什么,但是 'x == undefined' 或者 undefined(x) 更简洁。而且我经常需要测试 undefined。只是想让我的生活变得更轻松一些... - Mark Brown
4个回答

7

不要重新定义undefined

其他程序员希望undefined始终是undefined,而不是为了函数而存在的函数。

人们经常使用typeof运算符来确保在测试未定义变量时不会抛出引用错误。

如果有人这样对你做,你可以使用...

undefined = void 0;

...将其恢复回去。


1
当然,有些人会采取防御性措施并使用void运算符进行测试:if (a === void 0) - Reid
如果您想要自己的函数来实现这个功能,只需将其命名为 isUndefined() 或类似名称,以避免覆盖正常的 undefined - nnnnnn
1
澄清一下,var undefined 部分没问题,但将其变成函数就不行。 - Tyler

5
作为一个Javascript关键字undefined本身并没有什么问题。但是,在第二个例子中,你覆盖了一个经常用于检查未定义变量的核心变量,并将其设置为一个函数。如果我在审核任何人的代码时看到这种情况,我会尖叫并禁止他们提交代码。

非常好的观点。谢谢。也许我只会将该函数命名为isset。 - Mark Brown
不是真的,function undefined(){}会抛出错误,因为undefined是只读的。 - Adam Bergmark
@adam:不确定你从哪里得到的(也许是浏览器相关的?):http://jsfiddle.net/9pK8N/。在Chrome中运行得非常好。 - Demian Brecht
Chrome在这里违反了规范。 undefined的值为undefined(参见8.1)。该属性具有以下特性:{[[Writable]]: false,[[Enumerable]]: false,[[Configurable]]: false}。 - Adam Bergmark
@adam: 很好了解,不过它在Chrome、FF4和(令人惊讶的是?)IE8中都能工作。 - Demian Brecht

1

undefined只是全局对象的默认属性,您可以覆盖/重新定义它。这就是为什么您应该始终使用typeof x == 'undefined'测试undefined,因为typeof运算符无法被重新定义。

var undefined;

if(x == undefined){
    //do something
}

这里发生的是你定义了一个名为"undefined"的新变量,你没有给它赋值,因此它的值为undefinedx也未定义,其值也为undefined。 因此两者相等。虽然这样做毫无意义。

是的,我明白它为什么有效。我只是试图弄清楚为什么根据js lint我不应该这样做。 - Mark Brown
在第一个示例中重新定义undefined显然是毫无意义的。将其重新定义为函数会破坏检查 x == undefined 的代码 (你本来就不应该这样做,但是......)。 - deceze
我绝对不会同时使用它们,但我理解你的观点。从迄今为止的回复中,我可以看出这是一个坏主意。 - Mark Brown

1

undefined在JavaScript(ECMA-262)中不是保留字。它是一种名为Undefined的常量类型;

通过声明:

var undefined;

你在本地作用域中使用相同的变量名进行声明。

从技术上讲,你可以这样做,只是不要定义类似于这样的内容:

var undefined = 13;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接