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

alert( x );

我如何捕捉这个错误?


当前回答

我们可以像下面这样检查undefined

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}

其他回答

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

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

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

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

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

在JavaScript中,null是一个对象。对于不存在的东西,还有另一个值,未定义。DOM在几乎所有无法在文档中找到某些结构的情况下都会返回null,但在JavaScript中使用的值是undefined。

第二,不,没有直接的等价物。如果你真的想检查是否为空,请执行:

if (yourvar === null) // Does not execute if yourvar is `undefined`

如果想检查变量是否存在,只能使用try/catch,因为typeof会将未声明的变量和声明值为undefined的变量视为等效。

但是,要检查变量是否已声明且未定义:

if (yourvar !== undefined) // Any scope

以前,必须使用typeof操作符安全地检查未定义,因为可以像变量一样重新赋值未定义。旧的方法是这样的:

if (typeof yourvar !== 'undefined') // Any scope

在2009年发布的ECMAScript 5中修正了undefined可重赋的问题。现在,您可以安全地使用===和!==来测试未定义,而无需使用typeof,因为未定义已经只读了一段时间。

如果你想知道一个成员是否独立存在,但不关心它的值是什么:

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance

如果你想知道一个变量是否为真:

if (yourvar)

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

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

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

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

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

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

void操作符对于传递给它的任何参数/表达式都返回undefined。因此,您可以根据结果进行测试(实际上,一些微型程序将代码从undefined更改为void 0以节省几个字符)

例如:

void 0
// undefined

if (variable === void 0) {
    // variable is undefined
}

我经常这样做:

function doSomething(variable)
{
    var undef;

    if(variable === undef)
    {
         alert('Hey moron, define this bad boy.');
    }
}