2010-12-05 61 views
8

未定义可以将此代码检查空/ JavaScript中

if (typeof foo != "undefined" && foo !== null) { } 

安全地重构这个代码?

if (foo != null) { } 

这是完全一样的东西吗? (如果不是,它是如何不同?)

+0

的可能重复的http:/ /stackoverflow.com/questions/801032/null-object-in-javascript – Hps 2010-12-05 18:43:00

+0

@HPS我搜索了SO。这个问题从来没有被问到。 – 2010-12-05 18:46:27

回答

11

不是真的。如果foo尚未声明,则会在第二个示例中抛出ReferenceError异常。

在另一方面,你可以安全地检查是否与typeof操作未定义非声明的变量。

+0

@Daniel我不明白。如果我有`var foo;`然后运行第二个代码段,则不会抛出任何错误(至少在Chrome中不会)。 – 2010-12-05 18:45:26

2

一个简单的实验将回答这个问题:

if(foo != null) { 
    alert('foo not null'); 
} 

上面的例子在许多浏览器产生一个JavaScript错误:"ReferenceError: Can't find variable: foo"。这是因为我们使用了一个先前未被声明为变量的变量,或者在当前作用域中使用了var

typeof运营商,在另一方面,为使未被定义的变量的显式的住宿 - 它返回'undefined',所以:

if(typeof foo != 'undefined') { 
    alert('foo is not defined'); 
} 

按预期工作。

因此,答案是“不” - 他们不是同样的事情 - 尽管在一些 JavaScript环境,他们的行为可能以同样的方式,在其他环境中你的第二个表单将产生错误时foo不定义。

2

变量可以实际持有价值undefined,这是默认值,如果一个变量从未被分配到。所以foo != null将工作,如果你的变量声明使用var或通过赋值赋予一个值,但如果它不是,你会得到一个ReferenceError。因此,这两个片段是而不是等效。

如果你可以肯定的是foo声明,这是安全和更容易理解比你原来的第二个片段,假设无处代码类似undefined = 42存在:

if(foo !== undefined && foo !== null) { }