检查JavaScript中是否存在空/未定义
你能用这个密码吗检查JavaScript中是否存在空/未定义,javascript,Javascript,你能用这个密码吗 if (typeof foo != "undefined" && foo !== null) { } 是否可以安全地重构到此代码中 if (foo != null) { } 完全一样吗?(如果没有,又有什么不同呢?不太一样。如果未声明foo,则在第二个示例中会抛出一个异常 另一方面,您可以使用运算符安全地检查未定义的未声明变量。一个简单的实验将回答这个问题: if( foo != null ) { alert('foo not null'); }
if (typeof foo != "undefined" && foo !== null) { }
是否可以安全地重构到此代码中
if (foo != null) { }
完全一样吗?(如果没有,又有什么不同呢?不太一样。如果未声明
foo
,则在第二个示例中会抛出一个异常
另一方面,您可以使用运算符安全地检查未定义的未声明变量。一个简单的实验将回答这个问题:
if( foo != null ) {
alert('foo not null');
}
上面的示例在许多浏览器中都会产生javascript错误:“ReferenceError:找不到变量:foo”
。这是因为我们使用了一个变量,该变量以前没有在当前范围内声明为参数或var
另一方面,typeof
运算符对尚未定义的变量进行显式调整——它返回“未定义”
,因此:
if( typeof foo != 'undefined') {
alert('foo is not defined');
}
一切正常
因此答案是“否”——它们不是同一件事——尽管在某些javascript环境中它们的行为方式可能相同,但在其他环境中,当未定义
foo
时,您的第二种形式将产生错误。变量实际上可以包含未定义的值,如果从未为变量赋值,则为默认值。所以foo!=如果使用var
声明变量或通过赋值给变量赋值,则null
将起作用,但如果不是,则会出现引用错误。因此,这两个代码段并不相等
如果您可以确保声明了foo
,那么这比原始的第二个代码片段更安全、更容易理解,假设代码中不存在类似undefined=42
的内容:
if(foo !== undefined && foo !== null) { }
可能是我搜索的@Hps的副本。这个问题从未被问过。@Daniel我不明白。如果我有var foo然后运行第二个代码段,不会抛出错误(至少在Chrome中不会)。@Sime:Tryif(aNewFoo!=null){}
而不声明var-aNewFoo代码>之前。然后再次尝试if(typeof aNewFoo!=“undefined”){}
,但不声明变量。。。这就是区别。@Daniel Aha,因此如果未声明foo
,则将抛出错误,如果声明了但恰好包含未定义的值,则不会抛出错误。对吗?@Sime:对,没错。因此,typeof x===“undefined”
可以检查未声明或已设置为undefined
的变量。这是两个示例之间的主要区别。@Daniel如果我们测试属性(如window.foo
),而不仅仅是变量(foo
),则抛出错误的问题似乎不会发生。在本例中,较长形式的(typeof window.foo!=“undefined”&&window.foo!==null)
相当于较短形式的(window.foo!=null)
,对吗?因此,如果声明了foo
,那么我的两个代码片段是等效的。但是如果未声明foo
,则两个代码段不相同,因为第二个代码段会抛出错误。对吗?西姆·维达斯:据我所知,是的。我仍然认为原始代码片段更好,因为它更清楚它的作用。引用道格拉斯·克罗克福德(Douglas Crockford)的JavaScript:The Good Parts:“当操作数属于同一类型时,邪恶的孪生兄弟会做正确的事情,但如果它们属于不同的类型,他们会试图强制执行值。他们这样做的规则是复杂且不可修改的。”是的,第一个片段就是要做的。我原以为我可以简化该检查(因为在JavaScript中null==未定义),但事实证明我不能。