如何在JavaScript中检查未定义的变量


911

我想检查变量是否已定义。例如,以下引发未定义的错误

alert( x );

如何捕获此错误?




1
这不是标记重复项的重复项。可变分辨率和对象属性分辨率是完全不同的东西。一个更好的副本是如何检查javascript中是否存在变量?
RobG

您的错误是由于未声明变量。大多数答案都集中在作业上。看到我的答案更多。此外,其中许多错误地指出null和undefined是JavaScript中的对象。它们是原始的,而不是对象……
JBallin

Answers:


1689

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

第二,不,没有直接对等的内容。如果您确实要专门检查null,请执行以下操作:

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

如果要检查变量是否存在,则只能使用try/ 来完成catch,因为typeof它将未声明的变量和声明为的变量undefined等效。

但是,检查是否声明一个变量不是undefined

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

以前,必须使用typeof运算符来安全地检查未定义的内容,因为有可能undefined像变量一样重新分配。原来的样子是这样的:

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

undefined可重新分配的问题已在2009年发布的ECMAScript 5中得到修复。现在,您可以安全地使用===!==测试,undefined而在不使用的情况下typeof,它undefined已经被只读了一段时间。

如果您想知道成员是否独立存在,但不在乎其值是什么:

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

如果您想知道变量是否为

if (yourvar)

资源


71
未定义不是保留字;您(或其他人的代码)可以执行“ undefined = 3”,这将破坏您的两个测试。
杰森S

6
“如果您知道该变量存在,但不知道其中是否存储了任何值” –是吗?
杰森S

36
我认为他指的是一个尚未赋值的声明变量。例如:var foo; // foo的存在,但不具有价值
沃利劳利斯

3
嗯...我刚刚注意到“源”链接:整篇文章都是邮件列表的直接引文,并且可能需要对其进行编辑以使内容更加清楚,因为原始作者无法澄清。
杰森·S

11
“在JavaScript中,null是一个对象。”,实际上并非如此,这种误解的罪魁祸首可能是typeof运算符(typeof null == 'object')。该null原始值,它是Null类型的唯一值。
CMS

347

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

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

该线程中的其他一些解决方案会让您相信即使定义了变量,该变量仍未定义(例如,值为NULL或0)。


18
因为问题是未定义的,所以这里的类型应该是someVar!=='undefined',对吗?
eomeroff 2012年

1
真的,我不认为未定义对象是一个对象,请先查看文档developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
Nicramus

2
唯一不会产生的测试ReferenceError
Nostalg.io 2015年

2
这段代码是正确的,但是我认为这是undefinedjavascript中的一个对象,是错误信息。这句话是否与您的答案相关?它是undefined类型的值undefined,分配给名为的全局标识符undefined
SimplGy

1
现在这是不正确的,因为这是唯一的方法。undefined从ES5开始一直为只读。您可以使用if (x === undefined) {...}或这样的速记安全地测试未定义内容:if (x === void 0)
Stephen M Irving

66

从技术上讲,正确的解决方案是(我认为):

typeof x === "undefined"

有时您可能会变得懒惰并使用

x == null

但这允许未定义的变量x和包含null的变量x都返回true。


1
如果您键入var x;,然后typeof x;您会得到"undefined"与输入相同的信息typeof lakjdflkdsjflsj;
Muhammad Umer

因此,没有办法检查未定义但已声明的变量吗?
穆罕默德·乌默尔

1
我不这么认为。我不确定为什么要这么做。
杰森·S

ujndefined不应在顶点之间
LowFieldTheory

尖头是什么意思?
杰森S

19

一个更简单,更速记的版本是:

if (!x) {
   //Undefined
}

要么

if (typeof x !== "undefined") {
    //Do something since x is defined.
}

26
如果从函数调用中设置了x,则第一个代码段可能不正确。像x = A(); 如果A不返回任何内容,则默认情况下将返回“未定义”。做一个!x是正确的,这在逻辑上是正确的。但是,如果A()返回0,则x应该为false,因为x = 0。但是,在JS中,!0也是如此。
拉贾特2009年

第二个代码可以简化为:if(!typeof(XX)){...} else {...}
Alejandro Silva

2
@AlejandroSilva抱歉,回复晚。由于typeof返回一个字符串,所以该方法将不起作用,因此它将为未定义的变量返回“ undefined”,该变量的求值结果为TRUE,因此导致所定义var的假肯定。
Dmitri Farkov

5
请摆脱第一个摘要,这很糟糕
Juan Mendes

1
其他评论指出,第一个示例是不好的,但不清楚原因。因此,对于任何新的编码人员:!x不会测试x是否已定义,但是否真实。字符串,布尔值true和正数都是真实的(我可能会忘记一些事情),但是其他可能有效的值(例如0,布尔值false和空字符串)也不是真实的。第一个示例可以用于特定的用例(例如,如果可以将空值视为未定义的字符串,则测试字符串),但是由于很多地方用不到它,因此不应将其视为默认的检查方式。
cfc

16

我经常这样做:

function doSomething(variable)
{
    var undef;

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

9
考虑将“ ==”更改为“ ===“。如果调用doSomething(null),也会收到警报。除非那是您想要的。
杰森·S

是的 您必须决定要相等还是完全相等。无论哪种情况都有用。

1
只需像这样检查-> if(typeof variableName!=='undefined'){alert(variableName);}
穆罕默德·萨迪克

这是无用的,因为无论如何您都无法将未定义的var传递给函数
avalanche1

2
你当然可以。尝试不带参数的函数。

3

您还可以使用三元条件运算符:

var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);

//var a = "hallo world";
var a = !a ? document.write("i dont know 'a'") : document.write("a = " + a);


如果var a = false;呢?您应该检查是否a===undefined改为
Iter Ator

1
问题:检查未定义的变量.....这是未定义的变量:var x; 执行上述操作将引发错误
Muhammad Umer

“如果a = false,那么它将显示“我不知道'a'”” –这就是问题所在,问题是要测试是否已定义,而不是是否正确。如果将a定义为false,则a不是未定义的。在这种情况下,这将返回错误的结果。请参阅我对stackoverflow.com/a/858270/2055492的评论,以详细了解为何此方法无效。
cfc

不仅会!a测试true undefined,而且还会测试0and null和true false。这是非常不正确的,应删除。
Stephen M Irving

2

我经常使用最简单的方法:

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

编辑:

如果不初始化变量,将引发异常“ Uncaught ReferenceError:变量未定义...”


2
Uncaught ReferenceError: variable is not defined
穆罕默德·乌默尔

@MuhammadUmer,错了!variable由定义var variable;。并且此代码段将variable在本地范围内覆盖。它会破坏期望访问闭包或全局变量的逻辑。即var variable = 1; function test() { var variable; if (variable === undefined){ console.log('Variable is undefined'); } else { console.log('Variable is defined: ' + variable); } } test(); // Variable is undefined
ЕвгенийСавичев

2

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

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

这根本不能解决原始问题,并且是完全不相关的。海报没有问如何测试某些东西是真还是假,他问如何进行测试undefined。这不会那样做。
Stephen M Irving

2

错误告诉您x甚至不存在!尚未声明,与分配值不同。

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

如果声明了x,则不会出错。您会收到一条警报,说undefined是因为x存在/已被声明但尚未分配值。

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

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

这是在检查存储在中的值的类型x。它只会返回undefinedx,如果它没有被申报或被宣布和尚未分配。


从ES5(2009版)开始,undefined一直是只读的,并且您不再需要该typeof运算符。
Stephen M Irving

2

void操作者返回undefined任何参数/表达传递给它。因此您可以根据结果进行测试(实际上,一些缩小程序将您的代码从更改undefinedvoid 0来保存几个字符)

例如:

void 0
// undefined

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

叮叮!这是正确的答案。可耻的是一直在底部。每个人都挂断电话仍在使用typeofundefined可以重新分配思维,这已经有大约十年了。
Stephen M Irving

在ES5之前这也是安全的,因为那时即使您已重新分配undefined,因为上帝只知道是什么原因,无论如何,使用void 0都会返回undefined
Stephen M Irving

1

我们可以检查undefined如下

var x; 

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

1

只需执行以下操作:

function isNotDefined(value) {
  return typeof value === "undefined";
}

并这样称呼:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false

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块,这有点混乱,因为它会创建块级范围。而且,当然,该示例已大大简化,可以回答所提出的问题,它没有涵盖错误处理的最佳实践;)。


0

我使用一个小函数来验证已声明的变量,这确实减少了我的javascript文件中的混乱情况。我添加了一个值检查,以确保该变量不仅存在,而且还被分配了一个值。第二个条件检查该变量是否也已实例化,因为如果已定义该变量但未实例化(请参见下面的示例),则在尝试在代码中引用它的值时,它仍然会引发错误。

未实例化- var my_variable;实例化-var my_variable = "";

function varExists(el) { 
  if ( typeof el !== "undefined" && typeof el.val() !== "undefined" ) { 
    return true; 
  } else { 
    return false; 
  } 
}

然后,您可以使用条件语句来测试变量是否已定义并实例化,如下所示...

if ( varExists(variable_name) ) { // checks that it DOES exist } 

或测试它是否尚未定义和实例化使用...

if( !varExists(variable_name) ) { // checks that it DOESN'T exist }

1
为什么不立即返回谓词?return typeof el !== "undefined" && typeof el.val() !== "undefined"
Skubski
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.