此代码可以
if (typeof foo != "undefined" && foo !== null) { }
安全地重构为此代码?
if (foo != null) { }
这是完全一样的吗? (如果没有,它有什么不同?)
答案 0 :(得分:11)
不是真的。如果未声明foo
,您将在第二个示例中抛出ReferenceError
个异常。
另一方面,您可以使用typeof
运算符安全地检查未定义的非声明变量。
答案 1 :(得分: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 :(得分:2)
变量实际上可以保存值undefined
,如果从未赋值变量,则该值为默认值。因此,如果使用foo != null
声明变量或通过赋值给出值,var
将起作用,但如果不是,则会得到ReferenceError。因此,这两个片段不等效。
如果您确定声明了foo
,那么这比原始的第二个片段更安全,更容易理解,假设代码中没有undefined = 42
存在:
if(foo !== undefined && foo !== null) { }