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

如何检查JavaScript中未定义的变量,javascript,variables,undefined,Javascript,Variables,Undefined,我想检查变量是否已定义。例如,下面抛出一个未定义的错误 alert( x ); 如何捕获此错误?在JavaScript中,null是一个对象。对于不存在的事物,还有另一个值,未定义。对于几乎所有无法在文档中找到某种结构的情况,DOM都返回null,但在JavaScript本身中,使用的值是undefined 第二,不,没有直接的等价物。如果您确实想专门检查null,请执行以下操作: if (yourvar === null) // Does not execute if yourvar is

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

alert( x );

如何捕获此错误?

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

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

if (yourvar === null) // Does not execute if yourvar is `undefined`
如果要检查变量是否存在,则只能使用
try
/
catch
,因为
typeof
会将未声明的变量和声明值为
未定义的变量视为等效变量

但是,要检查变量是否已声明且未定义,请执行以下操作:

if (yourvar !== undefined) // Any scope
以前,有必要使用
typeof
操作符来安全地检查未定义,因为可以像变量一样重新分配
undefined
。老办法是这样的:

if (typeof yourvar !== 'undefined') // Any scope
2009年发布的ECMAScript 5解决了
未定义
可重新分配的问题。您现在可以安全地使用
==
==typeof
测试
未定义的
,因为
未定义的
已只读一段时间

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

if ('membername' in object) // With inheritance
if (object.hasOwnProperty('membername')) // Without inheritance
如果您想知道某个变量是否为:


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

你有时会变得懒惰,并使用它

x == null

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

更简单、更简捷的版本是:

if (!x) {
   //Undefined
}

我经常这样做:

function doSomething(variable)
{
    var undef;

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

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

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

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

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

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


如果不初始化变量,将引发异常“未捕获引用错误:未定义变量…”

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

var a=“你好世界”;

变量a=!A.document.write(“我不知道‘a’”):document.write(“a=“+a”)我们可以检查
未定义的
,如下所示

var x; 

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

公认的答案是正确的。只是想再增加一个选项。您也可以使用
尝试。。。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
block,它有点凌乱,因为它创建了块级范围。当然,为了回答所提出的问题,该示例非常简单,它不包括错误处理方面的最佳实践;)

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

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

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

例如:

void 0
// undefined

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

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

未实例化-
var my_变量实例化-
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 }

只需执行以下操作:

function isNotDefined(value) {
  return typeof value === "undefined";
}
把它叫做:

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

未定义不是保留字;您(或其他人的代码)可以执行“undefined=3”,这将破坏您的两个测试。“如果您知道变量存在,但不知道其中是否存储了任何值”——嗯?!我认为他指的是一个声明的变量,该变量尚未赋值。例如:var foo;//foo存在但没有值hmmm。。。我刚刚注意到了“source”链接:这篇文章是从邮件列表中直接引用的,可能应该进行编辑以使其更清楚,因为原始作者无法澄清。“在JavaScript中,null是一个对象。”,这实际上不是真的,而且这种误解的罪魁祸首可能是
typeof
操作符(<代码> Type of NoL=='Objult'/Cult>).a是唯一的值。考虑更改“==”到“===”。如果调用DOSEMOTY(NULL),也将得到
if( !varExists(variable_name) ) { // checks that it DOESN'T exist }
function isNotDefined(value) {
  return typeof value === "undefined";
}
isNotDefined(undefined); //return true
isNotDefined('Alireza'); //return false