2011-05-20 34 views
4

这个测试对于undefined有什么问题吗?使用'var undefined'来测试undefined有什么问题

var undefined; 

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

或本:

function undefined(x){ 
    return typeof x == 'undefined'; 
} 

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

的JSLint不抛出一个RESERVERD字错误,但代码似乎仍然工作...

+0

有什么错,如果(typeof运算(X)=== '未定义')只是为了测试{...} – 2011-05-20 01:58:27

+0

@Tim O什么都没有,但是'x == undefined'或undefined(x)要短得多。最后我经常测试未定义的。只是想让我的生活变得更容易... – 2011-05-20 02:02:29

回答

7

不要重新定义undefined

其他程序员期望undefined总是undefined,而不是函数的功能。

人们经常使用typeof运算符来确保在用于测试undefined变量时不引用参考错误。

一旦有人做到这一点给你,你可以使用...

undefined = void 0; 

...恢复回来。

+1

当然,有些人会采取防御措施,并使用'void'运算符来测试:'if(a === void 0)'。 – Reid 2011-05-20 02:03:28

+0

@Reid有趣。 – alex 2011-05-20 02:04:13

+0

这是有道理的。谢谢。 – 2011-05-20 02:05:38

1

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

var undefined; 

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

什么发生在这里的是你定义了一个名为“未定义”新的变量,你不分配一个值和因此获得的价值undefinedx既未定义也有值undefined。因此两者都是平等的。这是毫无意义的。

+0

是的。我明白它为什么有效。我只是想弄清楚为什么我不应该这样做根据js lint – 2011-05-20 02:05:20

+0

@Mark重新定义'undefined'就像第一个例子显然没有意义。将它重新定义为一个函数会破坏代码,检查'x == undefined'(你不应该这样做,但是,嘿...)。 – deceze 2011-05-20 02:08:27

+0

我绝对不会一起使用它们,但我明白你的观点。从迄今为止的回复中我可以看出这是一个糟糕的主意。 – 2011-05-20 02:11:11

5

因为undefined不是Javascript keyword,它本身没有什么问题。

但是,您正在覆盖核心变量,该变量经常用于检查第二个示例中的未定义变量作为函数。如果我看到任何我正在审阅的代码,我会尖叫并禁止该人为提交者。

+0

非常好的一点。谢谢。也许我只是命名函数isset – 2011-05-20 02:06:21

+0

不正确,'undefined(){}'抛出一个错误,因为'undefined'是只读的。 – 2011-05-20 02:11:32

+0

@adam:不知道你从哪里得到(可能是浏览器依赖?):http://jsfiddle.net/9pK8N/。在Chrome中运行得很好。 – 2011-05-20 02:16:05

1

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

通过声明:

var undefined; 

声明变量,在局部范围相同的名称。

因此从技术上讲,你可以做到这一点,只是不定义是这样的:

var undefined = 13;