JavaScript中如何处理'undefined'?

90

可能是重复问题:
JavaScript中检测未定义对象属性

从以下JavaScript示例中,

try {
    if(jsVar) {
        proceed();
    }
}
catch(e) {
    alert(e);
}

这个jsVar在另一个文件中被声明和初始化。

问题是,当这段代码在另一个文件(其中jsVar被声明和初始化)被执行之前执行时,会抛出未定义的错误。因此,它被try和catch包围。

有什么比try catch更好的处理未定义错误的方法吗?


1
我不明白,即使这个问题被标记为重复,它仍然获得了48个赞。这难道不是缺乏判断力,并降低了这些赞的质量吗?而且如果重复的问题获得赞,投票可能会出问题。 - jyotibisht
3个回答

119

你可以通过以下方法验证这个事实:

if (typeof jsVar == 'undefined') {
  ...
}

这种方式有什么优势超过我的方法吗? - Jan Hančič
可能会抛出错误:jsVar未定义。您应该这样测试它:if (window.jsVar!== undefined) {}。似乎typeof()“捕获”此错误。 - Fabien Ménager
@Fabien:或者使用if("jsVar" in window){}... 但我会避免需要为此错误情况编写代码的情况。 - Thomas Eding
@logic-unit 理论上更好,但对于 typeof 比较来说 == 已经足够了,因为可能返回的值只有几种 - berbt
你可以使用 typeof 来确定未计算操作数的类型。它将返回一个字符串形式的操作数类型。如果你知道它们是相等的值和相等的类型,你可以使用 "==="。 - DevBert

15

通常情况下在JavaScript中会有多种方法来实现这个目的:

typeof foo !== 'undefined'
window.foo !== undefined
'foo' in window

前两个应该是等效的(只要foo没有被本地变量遮盖),而最后一个将返回true如果全局变量被定义,但未初始化(或明确设置为undefined)。


嗯,在Windows中,'foo'似乎返回false,即使对我来说已经定义了foo,事实上,只有typeof在我的情况下起作用。 - Fuseteam

1
在JavaScript中,以下值会导致if条件失败,不执行其语句:null、undefined、false、NaN、数字0和空字符串''。
假设变量jsVar是一个布尔值,并且我们希望在jsVar为真时调用proceed()方法,我们可以进行如下检查。
if (jsVar && jsVar == true)
    proceed();

以上代码片段首先检查 jsVar 是否已定义,然后检查其值是否为 true。只有当两个条件都满足时,if 条件才会被满足。
如果 jsVar 不是布尔值,则我们可以在上面的代码中替换相应的检查。

请注意,这并不检查布尔值 true,因为您没有使用严格比较(在JS中,例如 '1' == true 是真的!);如果变量未定义,这仍会抛出引用错误,即您的代码无法解决Madhu的问题。 - Christoph
@Christoph 你说得对! - Scott

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接