ChatGPT解决这个技术问题 Extra ChatGPT

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

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

alert( x );

我怎样才能捕捉到这个错误?

这不是标记副本的副本。可变分辨率和对象属性分辨率是非常不同的东西。更好的副本是 how to check if a variable exist in javascript?
您的错误是由于未声明变量。大多数答案都集中在作业上。有关更多信息,请参见my answer。此外,其中许多错误地指出 null 和 undefined 是 JavaScript 中的对象。它们是 primitives,而不是对象...

S
Stephen M Irving

在 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,因为可以像变量一样重新分配 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

如果您想知道变量是否为 truthy

if (yourvar)

Source


undefined 不是保留字;您(或其他人的代码)可以执行“undefined = 3”,这将破坏您的两个测试。
“如果您知道变量存在但不知道其中是否存储了任何值”——嗯?!
我认为他指的是一个尚未分配的已声明变量。例如:var foo; // foo 存在但没有值
嗯...我刚刚注意到“来源”链接:整个帖子是从邮件列表中直接引用的,可能应该对其进行编辑以使其更清楚,因为无法澄清原作者。
“在 JavaScript 中,null 是一个对象。”,这实际上并不正确,而且这种误解的罪魁祸首可能是 typeof 运算符(typeof null == 'object')。 null value 是一个 primitive value,它是 Null type 的唯一值。
P
Peter Mortensen

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

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

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


因为这里的问题 IS NOT UNDEFINED 应该是 typeof someVar !== 'undefined',对吧?
真的,我不认为 undefined 是一个对象,首先检查文档developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures
唯一不产生 ReferenceError 的测试。
这段代码是正确的,但我认为说 undefined 是 javascript 中的一个对象是错误信息。这个陈述是否与您的答案有关?它是 undefined 类型的值 undefined,分配给名为 undefined 的全局标识符。
现在这是不正确的,因为它是唯一的方法。 undefined 自 ES5 以来一直是只读的。您可以使用 if (x === undefined) {...} 或使用如下简写安全地测试未定义:if (x === void 0)
P
Peter Mortensen

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

typeof x === "undefined"

你有时会变得懒惰并使用

x == null

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


如果您输入 var x;,然后输入 typeof x;,您将得到 "undefined",就像您输入 typeof lakjdflkdsjflsj;
那么没有办法检查未定义但声明的变量吗?
我不这么认为;我不知道你为什么想要。
ujndefined 不应该在顶点之间
你说的顶点是什么意思?
P
Peter Mortensen

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

if (!x) {
   //Undefined
}

或者

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

如果 x 是从函数调用中设置的,则第一个代码段可能不正确。像 x = A();如果 A 没有返回任何内容,它将默认返回“未定义”。做一个 !x 是真的,这在逻辑上是正确的。但是,如果 A() 返回 0,则 !x 应该为 false,因为 x=0。然而在 JS 中,!0 也是如此。
第二个代码可以缩短为: if(!typeof(XX)){ ... }else{ ... }
@AlejandroSilva 抱歉回复晚了。这不起作用,因为 typeof 返回一个字符串,因此它将为未定义的变量返回“未定义”,而该变量又将评估为 TRUE,因此导致已定义变量的误报。
请摆脱第一个片段,这很糟糕
其他评论指出第一个例子不好,但不清楚为什么。因此,对于任何新的编码人员: !x 不测试 x 是否已定义,而是测试它是否真实。字符串、布尔值 true 和正数都是真实的(我可能会忘记一些事情),但其他可能有效的值,如 0、布尔值 false 和空字符串不是真实的。第一个示例可以用于特定的用例(例如,如果您可以将空视为未定义,则测试字符串),但由于很多地方不会,因此不应将其视为默认检查方式。
J
Joe

我经常这样做:

function doSomething(variable)
{
    var undef;

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

考虑将“==”更改为“===”。如果您调用 doSomething(null) 您也会收到警报。除非那是你想要的。
是的。您必须决定是否要相等或完全相等。任何一种情况都有用。
像这样简单检查-> if(typeof variableName !== 'undefined'){ alert(variableName);}
这是没用的,因为无论如何您都无法将未定义的 var 传递给函数
你当然可以。尝试调用不带参数的函数。
s
svarog

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

例如:

void 0
// undefined

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

叮叮!这是正确的答案。耻辱它一直在底部。每个人都非常执着于仍然使用 typeof 并认为 undefined 可以重新分配,这在大约十年来一直是不可能的。
这在 ES5 之前也是安全的,因为那时即使你重新分配了 undefined ,因为只有上帝知道是什么原因,使用 void 0 总是会返回 undefined 无论如何。
A
Alex from Jitbit

很抱歉死灵,但这里的大多数答案都混淆了“未定义”和“未定义”

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

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

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

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


我更喜欢这个答案而不是接受的答案
F
Fka

该错误告诉您 x 甚至不存在!它没有被声明,这与被分配一个值不同。

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

如果您声明了 x,您将不会收到错误消息。您会收到一条提示 undefined,因为 x 存在/已声明但尚未分配值。

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

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

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


undefined 自 ES5(2009 版本)以来一直是只读的,您不再需要 typeof 运算符。
undefined !== 未定义,谢谢你的回答。如果你去 if(variable) 并且它没有定义你仍然会得到一个错误,而不是 typeof。
u
ubershmekel

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

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

这根本不能解决最初的问题,而且完全无关紧要。海报不是问如何测试某事是真还是假,他问的是如何测试undefined。这不会那样做。
尽管我同意斯蒂芬的观点,但这实际上并没有回答这个问题,但这正是我想要的。感谢@ubershmekel,添加“窗口”对象的想法帮助了我。 +1
A
Alireza

只需执行以下操作:

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

并称之为:

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

J
John

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

var a = "你好世界"; var a = !a ? document.write("我不知道'a'") : document.write("a = " + a);

//var a = "你好世界"; var a = !a ? document.write("我不知道'a'") : document.write("a = " + a);


如果 var a = false; 怎么办?您应该检查 if a===undefined
问题:检查未定义的变量.....这是未定义的变量:var x; 执行上述操作会引发错误
“如果a = false,那么它将显示“我不知道'a'””——这就是问题所在,问题是测试它是否已定义,而不是它是否为真。如果 a 被定义为 false,则 a 不是未定义的。在这种情况下,这会返回错误的结果。请参阅我对 stackoverflow.com/a/858270/2055492 的评论,详细了解为什么这种方法不起作用。
!a 不仅将测试 undefined 的真值,它还将测试 0nullfalse 的真值。这是非常不正确的,应该删除。
s
simhumileco

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

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

编辑:

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


Uncaught ReferenceError: variable is not defined
@MuhammadUmer,错了! variablevar 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
Е
Евгений Савичев

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


A
Arshid KV

我们可以检查undefined如下

var x; 

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

M
MistyDawn

我使用一个小函数来验证变量是否已被声明,这确实减少了我的 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 }

为什么不立即返回您的谓词? return typeof el !== "undefined" && typeof el.val() !== "undefined"