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

How to check a not-defined variable in JavaScript

提问人:Jineesh 提问时间:5/13/2009 最后编辑:Josh CrozierJineesh 更新时间:2/2/2022 访问量:1393711

问:

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

alert( x );

如何捕获此错误?

JavaScript 变量 undefined

评论

5赞 random 4/19/2010
看来这是爷爷:stackoverflow.com/questions/1485840/...... stackoverflow.com/questions/2647867/......- 伟大的爷爷也许是这样的:stackoverflow.com/questions/27509/......
3赞 jim0thy 5/13/2009
http://stackoverflow.com/questions/519145/how-to-check-whether-a-javascript-variable-defined/519157#519157
1赞 RobG 11/10/2015
这不是标记的重复项的重复项。变量分辨率和对象属性分辨率是截然不同的东西。更好的副本是如何检查javascript中是否存在变量?
0赞 JBallin 1/10/2018
您的错误是由于未声明变量所致。大多数答案都集中在作业上。请参阅我的答案以获取更多信息。此外,他们中的许多人错误地声明 null 和 undefined 是 JavaScript 中的对象。它们是基元,而不是对象......

答:

1859赞 Natrium 5/13/2009 #1

在 JavaScript 中,是一个对象。对于不存在的事物,还有另一个价值。DOM 几乎在所有情况下都返回它无法在文档中找到某些结构,但在 JavaScript 中是使用的值。nullundefinednullundefined

其次,不,没有直接的等价物。如果您真的想专门检查,请执行以下操作:null

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

如果要检查变量是否存在,则只能使用 /,因为会将未声明的变量和以 的值 声明的变量视为等价变量。trycatchtypeofundefined

但是,要检查变量是否已声明未声明:undefined

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

以前,必须使用运算符来安全地检查未定义,因为可以像变量一样重新赋值。旧的方式是这样的:typeofundefined

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

在 2009 年发布的 ECMAScript 5 中修复了可重新分配的问题。您现在可以安全地使用和测试,而无需使用,因为已经有一段时间是只读的了。undefined===!==undefinedtypeofundefined

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

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

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

if (yourvar)

评论

75赞 Jason S 5/13/2009
undefined 不是保留字;你(或其他人的代码)可以执行“undefined = 3”,这将破坏你的两个测试。
8赞 Jason S 5/13/2009
“如果你知道变量存在,但不知道其中是否存储了任何值”——嗯?!
38赞 Wally Lawless 5/13/2009
我认为他指的是一个声明的尚未赋值的变量。例如:var foo;foo 存在但没有值
5赞 Jason S 5/13/2009
嗯......我刚刚注意到“来源”链接:整篇文章都是来自邮件列表的直接引用,并且可能应该进行编辑以使其更清晰,因为原作者无法澄清。
12赞 Christian C. Salvadó 10/13/2011
“在 JavaScript 中,null 是一个对象”,这实际上并非如此,而且这种误解的罪魁祸首可能是运算符 ()。null 值是一个基元值,它是 Null 类型的唯一值。typeoftypeof null == 'object'
77赞 Jason S 5/13/2009 #2

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

typeof x === "undefined"

你有时会变得懒惰并使用

x == null

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

评论

1赞 Muhammad Umer 8/26/2016
如果你输入,然后你会得到就像你这样做一样var x;typeof x;"undefined"typeof lakjdflkdsjflsj;
0赞 Muhammad Umer 8/27/2016
所以没有办法检查未定义但已声明的变量?
1赞 Jason S 8/27/2016
我不这么认为;我不确定你为什么要这样做。
0赞 LowFieldTheory 4/3/2018
ujndefined 不应位于顶点之间
0赞 Jason S 4/4/2018
你说的顶点是什么意思?
19赞 Dmitri Farkov 5/13/2009 #3

一个更简单、更简写的版本是:

if (!x) {
   //Undefined
}

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

评论

29赞 Rajat 12/30/2009
如果从函数调用设置 X,则第一个代码段可能不正确。像 x = A();如果 A 不返回任何内容,则默认返回“undefined”。执行 !x 将是真的,这在逻辑上是正确的。但是,如果 A() 返回 0,则 !x 应为 false,因为 x=0。但是,在 JS 中,!0 也是正确的。
0赞 Alejandro Silva 6/7/2014
第二个代码可以缩短为:if(!typeof(XX)){ ... }else{ ... }
2赞 Dmitri Farkov 3/18/2015
@AlejandroSilva 很抱歉回复晚了。这是行不通的,因为 typeof 返回一个字符串,因此它将为未定义的变量返回“undefined”,而该变量的评估结果为 TRUE,因此会导致已定义变量的误报。
5赞 Ruan Mendes 2/12/2016
请删除第一个片段,这很糟糕
2赞 cfc 11/15/2018
其他评论指出,第一个例子很糟糕,但不清楚为什么。因此,对于任何新的编码人员来说:!x 不会测试 x 是否被定义,而是测试它是否真实。字符串、布尔值 true 和正数都是真实的(我可能忘记了一些事情),但其他可能有效的值(如 0、布尔值 false 和空字符串)不是真实的。第一个示例可以适用于特定的用例(例如,如果可以将空处理为未定义,则测试字符串),但由于许多示例不会,因此不应将其视为默认的检查方式。
16赞 Joe 5/13/2009 #4

我经常这样做:

function doSomething(variable)
{
    var undef;

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

评论

9赞 Jason S 5/13/2009
考虑将“==”更改为“===”。如果调用 doSomething(null),您也会收到警报。除非那是你想要的。
0赞 Joe 7/7/2011
是的。你必须决定你是想要等价还是完全相等。任何一种情况都有可能有用。
1赞 Muhammad Sadiq 8/19/2015
像这样简单检查-> if(typeof variableName !== 'undefined'){ alert(variableName);}
0赞 avalanche1 2/12/2017
这是无用的,因为无论如何你都无法将未定义的 var 传递给函数
2赞 Joe 2/13/2017
当然可以。尝试调用不带参数的函数。
399赞 Michael Wales 5/13/2009 #5

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

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

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

评论

20赞 eomeroff 8/6/2012
因为问题是 IS NOT UNDEFINED,这里应该是 typeof someVar !== 'undefined',对吧?
1赞 Nicramus 9/14/2014
真的,我不认为 undefinded 是一个对象,请先检查文档 developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
4赞 Nostalg.io 11/18/2015
唯一不产生 .ReferenceError
2赞 SimplGy 8/15/2016
这段代码是正确的,但我认为说是 javascript 中的对象是错误的信息。无论如何,这句话与你的答案有关吗?它是 类型的值,分配给名为 的全局标识符。undefinedundefinedundefinedundefined
1赞 Stephen M Irving 3/26/2020
就这是唯一的方法而言,这现在是不正确的。 自 ES5 以来一直是只读的。您可以使用或使用简写安全地测试未定义,如下所示:.undefinedif (x === undefined) {...}if (x === void 0)
2赞 mokiSRB 12/9/2015 #6

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

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

编辑:

如果不初始化变量,将抛出异常“Uncaught ReferenceError: variable is not defined...”

评论

2赞 Muhammad Umer 8/26/2016
Uncaught ReferenceError: variable is not defined
0赞 Евгений Савичев 8/12/2017
@MuhammadUmer,错了! 定义如下:此代码片段将在本地范围内覆盖。它可能会破坏期望访问闭包或全局变量的逻辑。即:variablevar variable;variablevar 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赞 John 2/12/2016 #7

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

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);

评论

0赞 Iter Ator 7/14/2016
如果?如果相反,您应该检查一下var a = false;a===undefined
1赞 Muhammad Umer 8/26/2016
问题:检查未定义的变量.....这是未定义的变量:执行上述操作将引发错误var x;
1赞 cfc 11/15/2018
“如果 a = false,那么它将显示”我不知道'a'“——这就是问题所在,问题是测试它是否被定义,而不是它是否为真。如果 a 定义为 false,则 a 不是未定义的。在这种情况下,这将返回错误的结果。请参阅我对 stackoverflow.com/a/858270/2055492 的评论,了解有关为什么这种方法不起作用的更多详细信息。
1赞 Stephen M Irving 3/26/2020
不仅会为 测试为 true,还会为 和 测试为 true。这是非常不正确的,应该删除。!aundefined0nullfalse
1赞 Arshid KV 7/5/2016 #8

我们可以检查如下undefined

var x; 

if (x === undefined) {
    alert("x is undefined");
} else {
     alert("x is defined");
}
3赞 Евгений Савичев 8/12/2017 #9

公认的答案是正确的。只是想再添加一个选项。您也可以使用 block 来处理这种情况。一个怪异的例子: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

3赞 ubershmekel 11/14/2017 #10

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

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

评论

0赞 Stephen M Irving 3/26/2020
这根本不能解决最初的问题,也完全无关紧要。Poster 不是问如何测试某件事是真是假,他问的是 如何测试。这不会那样做。undefined
1赞 Jarda 10/8/2020
虽然我同意斯蒂芬的观点,但这实际上并不是问题所在,但这正是我想要的。谢谢@ubershmekel,添加“窗口”对象的想法帮助了我。+1
5赞 JBallin 1/10/2018 #11

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

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

如果声明 ,则不会出现错误。你将收到一个警报,指出因为存在/已声明,但尚未分配值。xundefinedx

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

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

这将检查存储在 中的值的类型。它只会在尚未声明时返回,或者如果声明但尚未分配。xundefinedx

评论

0赞 Stephen M Irving 3/26/2020
undefined 自 ES5(2009 版)以来一直是只读的,您不再需要运算符。typeof
0赞 Wolle 4/8/2021
undefined !== 未定义,谢谢你的回答。如果你去 if(variable) 并且它没有定义,你就会得到一个错误,而不是 typeof。
5赞 svarog 7/2/2018 #12

void 运算符返回传递给它的任何参数/表达式。因此,您可以根据结果进行测试(实际上,一些压缩器将您的代码从 更改为 to 以保存几个字符)undefinedundefinedvoid 0

例如:

void 0
// undefined

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

评论

0赞 Stephen M Irving 3/26/2020
丁冬!这是正确答案。可惜的是,它一直都在底部。每个人都如此执着于仍在使用,并且思维可以重新分配,这在大约十年内是不可能的。typeofundefined
0赞 Stephen M Irving 3/27/2020
这在 ES5 之前也是安全的,因为那时即使你重新分配了,因为只有上帝知道什么原因,无论如何,使用总是会回来的。undefinedvoid 0undefined
1赞 MistyDawn 7/6/2018 #13

我使用一个小函数来验证变量是否已声明,这确实减少了我的 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赞 skubski 3/14/2019
为什么不立即返回您的谓词呢?return typeof el !== "undefined" && typeof el.val() !== "undefined"
3赞 Alireza 1/31/2019 #14

只需执行以下操作:

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

并这样称呼它:

isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false
14赞 Alex from Jitbit 11/12/2021 #15

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

  1. 未定义 - 已声明变量,但其值未定义。

  2. 未定义 - 甚至没有声明变量。

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

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

P.S. 我确实知道“案例 2”在现代 ES6 世界中变得越来越少见,但一些旧的遗留组件仍然存在于过去。

评论

1赞 xtian 5/30/2022
我更喜欢这个答案而不是公认的答案