Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查JavaScript中是否存在空/未定义_Javascript - Fatal编程技术网

检查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 fooif(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==未定义),但事实证明我不能。