我想检查变量是否有定义。例如,下面的代码会抛出一个未定义的错误

alert( x );

我如何捕捉这个错误?


当前回答

我经常用最简单的方法:

var variable;
if (variable === undefined){
    console.log('Variable is undefined');
} else {
    console.log('Variable is defined');
}

编辑:

如果没有初始化变量,将抛出异常"Uncaught ReferenceError: variable is not defined…"

其他回答

对不起,这里的大多数答案都混淆了“未定义”和“未定义”。

Undefined -一个变量声明了,但它的值是未定义的。 没有定义-变量甚至没有声明。

检查这两种情况的唯一安全方法是使用typeof myVar === 'undefined'

myVar === undefined将只检查case number(1)。如果myVar甚至没有声明,它仍然会抛出“myVar is not defined”for case number(2)。OP特别询问了“甚至没有定义”的情况(2)。

附注:我确实理解“情况2”在现代ES6世界中变得越来越少,但一些旧的遗留组件仍然存在于过去。

真正测试变量是否未定义的唯一方法是执行以下操作。记住,undefined是JavaScript中的一个对象。

if (typeof someVar === 'undefined') {
  // Your variable is undefined
}

这个线程中的其他一些解决方案会让你相信一个变量是未定义的,即使它已经定义了(例如,值为NULL或0)。

公认的答案是正确的。只是想多一个选择。你也可以用try…Catch块来处理这种情况。举个奇怪的例子:

var a;
try {
    a = b + 1;  // throws ReferenceError if b is not defined
} 
catch (e) {
    a = 1;      // apply some default behavior in case of error
}
finally {
    a = a || 0; // normalize the result in any case
}

注意catch块,它有点混乱,因为它创建了块级作用域。当然,为了回答问题,这个例子非常简单,它不包括错误处理的最佳实践;)

另一个潜在的“解决方案”是使用window对象。它避免了在浏览器中出现引用错误问题。

if (window.x) {
    alert('x exists and is truthy');
} else {
    alert('x does not exist, or exists and is falsy');
}

这个错误告诉你x根本不存在!它没有被声明,这与被赋值是不同的。

var x; // declaration
x = 2; // assignment

如果你声明了x,就不会出现错误。你会得到一个警告,说未定义,因为x存在/已经声明,但还没有被赋值。

要检查变量是否已声明,您可以使用typeof,任何其他检查变量是否存在的方法都会引发与初始时相同的错误。

if(typeof x  !==  "undefined") {
    alert(x);
}

这是检查存储在x中的值的类型。只有当x尚未声明或已声明且尚未赋值时,它才会返回undefined。