JavaScript 检查变量是否存在(已定义/初始化)

JavaScript check if variable exists (is defined/initialized)

提问人:Samuel Liew 提问时间:2/25/2011 最后编辑:John SlegersSamuel Liew 更新时间:12/11/2022 访问量:2495784

问:

哪种检查变量是否已初始化的方法更好/正确? (假设变量可以容纳任何内容(字符串、int、对象、函数等))

if (elem) { // or !elem

if (typeof elem !== 'undefined') {

if (elem != null) {
JavaScript 函数 变量 初始化 未定义

评论

12赞 11/23/2017
如果您想知道是否已声明,则 或footypeof foo === 'undefined'typeof foo === typeof undefined
5赞 Paul 7/24/2019
高投票答案不适用于已声明但具有值的变量。正确答案是这样的:stackoverflow.com/a/36432729/772035undefined
2赞 oligofren 9/24/2019
@Paulpro,使用的版本与其他版本没有相同的缺陷,但需要对 Node 进行一些调整(替换为 )。hasOwnProperty('bar')windowglobal
0赞 oligofren 9/24/2019
@Paulpro 确实如此,但在你回答之前,我正在思考这个问题,我得出的结论是,这并不是一个真正的实际问题。当您处理块或函数范围的变量时,它通常是您拥有或具有写入访问权限的代码,因此在任何情况下都会遇到可修复的运行时错误。然而,未定义(不存在)的变量的常见问题通常在于您无法控制的代码,因此您需要一种方法来检测它。所以这是 80/20 解决方案。
0赞 John Lord 5/17/2023
@Paul这不是最好的答案。与未定义(不带引号)进行比较。如果你使用引号,它会检查存储的值,如果你不使用引号,它会检查你是否曾经声明过它。请参阅下面的实际正确答案,stackoverflow.com/a/63459003/9008140

答:

3870赞 Jim Puls 2/6/2009 #1

您需要 typeof 运算符。具体说来:

if (typeof variable !== 'undefined') {
    // the variable is defined
}

评论

47赞 Morgan Cheng 2/6/2009
这看起来是一个很好的解决方案,但你能解释一下为什么这有效吗?
55赞 staticsan 2/6/2009
实际上,您应该检查该对象是否是您需要的样子。所以这将是 if( typeof console == 'object' ) { // 变量是我需要的 }
66赞 Jason S 5/13/2009
@George IV: “just do 'if( variable ) ” -- 嗯,不,false 和 0 失败。
19赞 scotts 5/5/2010
'if( variable )' 也无法测试对象属性的存在。
6赞 squarecandy 12/6/2011
“if (typeof variable !== 'undefined') { // 变量不是未定义 }” 也对我有用......谢谢!
40赞 Alan Geleynse 2/25/2011 #2

这取决于你是否只关心变量是否已定义,或者你是否希望它有一个有意义的值。

检查类型是否未定义将检查变量是否已定义。

=== null或者只会检查变量的值是否完全正确。!== nullnull

== null或将检查该值是否为 或 。!= nullundefinednull

if(value)将检查变量是 、 、 还是空字符串。undefinednull0

125赞 David Tang 2/25/2011 #3

在大多数情况下,您会使用:

elem != null

与简单的 不同,它允许 、 和 ,但拒绝 或 ,使其成为对参数或对象属性存在的一个很好的、通用的测试。if (elem)0falseNaN''nullundefined


其他检查也没有不正确,它们只是有不同的用途:

  • if (elem):如果保证为对象,或者 、 等被视为“默认”值(因此等价于 或 )。elemfalse0undefinednull

  • typeof elem == 'undefined'可用于指定对象对未初始化的变量或属性具有不同含义的情况。null

    • 这是唯一不会在未声明时抛出错误的检查(即没有语句,不是 的属性,或者不是函数参数)。在我看来,这是相当危险的,因为它允许错别字在不被注意的情况下溜走。为避免这种情况,请参阅以下方法。elemvarwindow

同样有用的是与以下各项的严格比较:undefined

if (elem === undefined) ...

但是,由于全局变量可以被另一个值覆盖,因此最好在使用变量之前在当前作用域中声明该变量:undefinedundefined

var undefined; // really undefined
if (elem === undefined) ...

艺术

(function (undefined) {
    if (elem === undefined) ...
})();

这种方法的第二个优点是 JS 压缩器可以将变量减少到单个字符,每次都为您节省几个字节。undefined

评论

25赞 Cory Danielson 4/16/2013
我很震惊你可以覆盖.我什至不认为这在答案中值得一提。可能是所有 Javascript 中最不可接受的变量名称。undefined
2赞 Alex W 9/9/2013
这会导致异常,并且要求您在全局上下文中使用变量之前使用...这不是最好的方法。window.
4赞 Liglo App 10/23/2014
由于这个覆盖问题,您应该始终使用 而不是 .void(0)undefined
0赞 rinogo 6/27/2018
+1 因为这个答案指出,有时您可能实际上希望将 、 等标识为无效值。false0
8赞 Jith 2/25/2011 #4

很难区分 undefined 和 null。Null 是要指示变量没有特定值时可以分配给变量的值。Undefined 是一个特殊值,它将是未赋值变量的默认值。


var _undefined;
var _null = null;

alert(_undefined); 
alert(_null); 
alert(_undefined == _null);
alert(_undefined === _null);

评论

1赞 demisx 1/2/2015
以内联方式显示每个警报的输出会很有帮助。
0赞 Fred Gandt 6/12/2015
@demisx同意了,但与其建议编辑,不如直接编辑呢?该选项的存在是有原因的。有些人可能认为这是粗鲁的;我认为它很有效率 - 所以自己编辑了答案(等待审查)。
1赞 Stephen P 7/3/2015
@Fred - 我查看了编辑历史记录,可以猜到为什么您的编辑被拒绝了......正如 Demisx 所建议的那样,您不仅仅是添加行来显示输出内容,而是显着改变了 Jith 发布的内容。
4赞 jpsimons 2/25/2011 #5

这取决于具体情况。如果你正在检查可能在代码之外全局定义的东西(比如jQuery),你需要:

if (typeof(jQuery) != "undefined")

(那里不需要严格的相等,typeof 总是返回一个字符串。但是,如果你的函数的参数可能已传递,也可能未传递,则它们将始终被定义,但如果省略,则为 null。

function sayHello(name) {
    if (name) return "Hello, " + name;
    else return "Hello unknown person";
}
sayHello(); // => "Hello unknown person"

评论

0赞 Tom 2/1/2022
我同意这里。我不知道为什么每个人都在没有必要的时候使用严格的平等。
1103赞 Samuel Liew 6/29/2011 #6

运算符将检查变量是否真的未定义。typeof

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

与其他运算符不同,该运算符在与未声明的变量一起使用时不会引发 ReferenceError 异常。typeof

但是,请注意,将返回 .我们必须小心避免将变量初始化为 的错误。为了安全起见,我们可以改用以下方法:typeof null"object"null

if (typeof variable === 'undefined' || variable === null) {
    // variable is undefined or null
}

有关使用严格比较而不是简单相等的更多信息,请参阅:
JavaScript 比较中应使用哪个等于运算符 (== vs ===)?
=====

评论

0赞 Zelphir Kaltstahl 5/17/2017
警告:如果您尝试使用点表示法访问对象的成员,则这不适用于 。some_object.a_member
0赞 dRamentol 11/16/2018
这不会检查变量是否存在,而是检查其值类型。您要检查是否已声明变量。@BrianKelley的答案是正确的。
1赞 Fuseteam 7/9/2019
为什么不只是它似乎也能捕捉到“未定义”的变量variable != null
0赞 Stevoisiak 3/9/2023
如果你想捕捉一个变量是未初始化的还是空的,你不能使用简单的相等吗?结婚if (typeof variable == 'undefined')
230赞 Brian Kelley 10/22/2012 #7

在 JavaScript 中,可以定义一个变量,但保留值 ,因此最常见的答案在技术上是不正确的,而是执行以下操作:undefined

if (typeof v === "undefined") {
   // no variable "v" is defined in the current scope
   // *or* some variable v exists and has been assigned the value undefined
} else {
   // some variable (global or local) "v" is defined in the current scope
   // *and* it contains a value other than undefined
}

这可能足以满足您的目的。以下测试具有更简单的语义,这使得您可以更轻松地精确描述代码的行为并自己理解它(如果您关心此类内容):

if ("v" in window) {
   // global variable v is defined
} else {
   // global variable v is not defined
}

当然,这是假设您在浏览器中运行(其中是全局对象的名称)。但是,如果你正在处理这样的全局变量,你可能在浏览器中。主观上,using 在风格上与 using 引用全局变量是一致的。通过将全局变量作为属性而不是变量访问,可以最大程度地减少在代码中引用的未声明变量的数量(为了进行 linting),并避免全局变量被局部变量遮蔽的可能性。此外,如果全局物让你的皮肤爬行,你可能会觉得只有用这根相对较长的棍子触摸它们会更舒服。window'name' in windowwindow.namewindow

评论

13赞 Eddie Monge Jr 6/6/2013
这仅检查变量是否是全局声明的。如果你的编码正确,那么你就限制了你的全局变量。它将为本地变量报告 false:(function() { var sdfsfs = 10; console.log(窗口中的“sdfsfs”);() `
4赞 temporary_user_name 1/22/2014
这是最好的f$#^%ing答案。我对此一筹莫展,试图弄清楚如何准确解释这个极端情况。明。不知道你可以这样做。
1赞 Shog9 7/26/2014
注意:您的答案已从 stackoverflow.com/questions/519145/ 迁移到此处......
0赞 qwertzguy 2/10/2016
对于 Angular 用户:不幸的是,ng-if 语句中似乎不允许使用它。
1赞 asdf3.14159 4/6/2021
这不适用于 或 变量constlet
11赞 boslior 1/3/2013 #8
if (typeof console != "undefined") {    
   ...
}

或者更好

if ((typeof console == "object") && (typeof console.profile == "function")) {    
   console.profile(f.constructor);    
}

适用于所有浏览器

评论

3赞 skalee 2/17/2013
为什么在您看来后者更好?
3赞 Broxzier 7/10/2013
@skalee我同意后者更好。原因很简单,在使用类型之前,请检查这些类型是否是您想要的类型。
0赞 Shog9 7/26/2014
注意:您的答案已从 stackoverflow.com/questions/519145/ 迁移到此处......
9赞 skalee 2/17/2013 #9

在问题中概述的特定情况下,

typeof window.console === "undefined"

等同于

window.console === undefined

我更喜欢后者,因为它更短。

请注意,我们仅在全局范围内查找(这是所有浏览器中的对象)。在这种特殊情况下,这是可取的。我们不想在其他地方定义。consolewindowconsole

@BrianKelley在他的精彩回答中解释了技术细节。我只是添加了缺乏的结论,并将其消化成更容易阅读的内容。

评论

0赞 Shog9 7/26/2014
注意:您的答案已从 stackoverflow.com/questions/519145/ 迁移到此处......
2赞 john k 10/11/2014
假。后者在我的控制台中抛出异常。
0赞 John Lord 5/17/2023
如何?显示堆栈跟踪。这不可能引发异常。Window 从不为 null。
12赞 shadowstorm 2/23/2013 #10

最高的答案是正确的,使用typeof。

然而,我想指出的是,在 JavaScript 中是可变的(出于某种不敬虔的原因)。因此,简单地进行检查有可能并不总是像您预期的那样返回,因为其他库可能已经更改了未定义。一些答案(例如@skalee)似乎更喜欢不使用 ,这可能会给人带来麻烦。undefinedvarName !== undefinedtypeof

处理此问题的“旧”方法是将 undefined 声明为 var,以抵消任何潜在的静音/覆盖。但是,最好的方法仍然是使用,因为它将忽略其他代码的任何覆盖。特别是如果你正在编写在野外使用的代码,谁知道页面上还能运行什么......undefinedtypeofundefined

评论

1赞 Wutaz 3/28/2014
这一点没有意义,因为如果 varName 未定义,则只会导致 ReferenceError。的可变性无关紧要。varName !== undefinedundefined
0赞 Shog9 7/26/2014
注意:您的答案已从 stackoverflow.com/questions/519145/ 迁移到此处......
2赞 kwarnke 9/20/2017
在较新的 Javascript 版本中,是只读属性。但是,为了防弹,您可以使用 . 始终返回。undefinedtypeof mvVar === typeof void 0void 0undefined
8赞 Ravindra Miyani 4/25/2014 #11

您可以使用运算符。typeof

例如

var dataSet;

alert("Variable dataSet is : " + typeof dataSet);

上面的代码片段将返回如下输出

变量 dataSet 为 : undefined。

评论

1赞 Shog9 7/26/2014
注意:您的答案已从 stackoverflow.com/questions/519145/ 迁移到此处......
9赞 Zv_oDD 9/30/2014 #12

最健壮的“是否定义”检查是使用 typeof

if (typeof elem === 'undefined')

如果您只是检查一个定义的变量来分配默认值,那么为了一个易于阅读的衬里 您通常可以这样做:

elem = elem || defaultElem;

通常使用起来没问题,请参阅:在 javascript 中设置默认值的惯用方法

还有这个使用 typeof 关键字的衬里:

elem = (typeof elem === 'undefined') ? defaultElem : elem;
103赞 Fred Gandt 5/2/2015 #13

检查是否窗口hasOwnProperty变量名称)

过多答案的替代方案;typeof

全局范围内使用语句声明的全局变量var varname = value;

可以作为 Window 对象的属性进行访问。

因此,该方法,其中hasOwnProperty()

返回一个布尔值,指示对象是否将指定的属性作为其自己的属性(而不是继承它)

可用于确定是否

“varname”的 a 已全局声明, 是 的属性。varwindow

// Globally established, therefore, properties of window
var foo = "whatever", // string
    bar = false,      // bool
    baz;              // undefined
//  window.qux does not exist

console.log( [
    window.hasOwnProperty( "foo" ), // true
    window.hasOwnProperty( "bar" ), // true
    window.hasOwnProperty( "baz" ), // true
    window.hasOwnProperty( "qux" )  // false
] );

最棒的是,在调用它时,我们没有使用可能尚未声明的变量——这当然是问题的一半。hasOwnProperty()

虽然并不总是完美理想的解决方案,但在某些情况下,这只是工作!

笔记

当使用 var 定义变量时,上述情况是正确的,而不是 let which:

声明块作用域局部变量,可以选择将其初始化为值。

与关键字不同,关键字全局定义变量,或局部定义整个函数的变量,而不管块范围如何。var

在程序和函数的顶层,与 不同,它不会在全局对象上创建属性。letvar

为了完整起见:根据定义,常量实际上不是可变的(尽管它们的内容可以是可变的);更相关的是:

与变量不同,全局常量不会成为窗口对象的属性。常量的初始值设定项是必需的;也就是说,您必须在声明它的同一语句中指定其值。var

常量的值不能通过重新赋值而更改,也不能重新声明。

const 声明创建对值的只读引用。这并不意味着它所持有的值是不可变的,只是变量标识符不能重新赋值。

由于变量或常量从来都不是继承该方法的任何对象的属性,因此不能使用它来检查它们是否存在。letconsthasOwnProperty()

关于 hasOwnProperty() 的可用性和使用:

Object 派生的每个对象都继承了该方法。[...]与 In 运算符不同,此方法不会检查对象的原型链。hasOwnProperty()

评论

2赞 CPHPython 9/14/2016
这是一个很棒的选择,应该在这个问题的首位投票。请用一个工作示例简化答案标题,该示例返回(例如 或 )。truewindow.hasOwnProperty('console')var hop = "p";window.hasOwnProperty('hop')
3赞 Zelphir Kaltstahl 5/17/2017
最后,由于访问不存在的成员而不会引发错误的东西......所有答案都忽略了一些东西。typeof
3赞 Armen Michaeli 6/15/2019
这个答案已经过时了——根据标准的 ECMAScript,你可以定义变量,其中这些变量不能作为 [或任何其他可用] 对象的属性使用。 测试是否存在属性,而不是变量,因此不能用于检测 定义的变量。letwindowhasOwnPropertylet
4赞 Fred Gandt 6/16/2019
@amn 关于使用,答案仍然是正确的,在这方面并没有过时。但是,我添加了一个注释,概述了 和 与 的用法有何不同。感谢您的灵感;我们一起崛起:)varletconstvar
2赞 Fred Gandt 6/18/2019
@amn我已经重写了答案(希望是最后一次),以更清楚地说明只能以规定的方式用于检查变量的存在。这对我来说读起来还不错。hasOwnPropertyvar
8赞 SoEzPz 7/4/2015 #14

根据对象的不同,我使用两种不同的方式。

if( !variable ){
  // variable is either
  // 1. '';
  // 2. 0;
  // 3. undefined;
  // 4. null;
  // 5. false;
}

有时我不想将空字符串评估为 falsey,因此我使用这种情况

function invalid( item ){
  return (item === undefined || item === null);
}

if( invalid( variable )){
  // only here if null or undefined;
}

如果你需要相反的东西,那么首先!变量变为!!变量,在无效函数中 === 变为 !=,函数名称更改为 notInvalid。

9赞 Razan Paul 9/21/2015 #15

Null 是 JavaScript 中的一个值,返回typeof null"object"

因此,如果传递 null 值,则接受的答案将不起作用。如果传递 null 值,则需要为 null 值添加额外的检查:

if ((typeof variable !== "undefined") && (variable !== null))  
{
   // the variable is defined and not null
}
5赞 curtwphillips 12/13/2015 #16

我的偏好是.typeof(elem) != 'undefined' && elem != null

无论您选择哪种方式,都可以考虑将检查放入这样的函数中

function existy (x) {
    return typeof (x) != 'undefined' && x != null;
}

如果您不知道变量已声明,请继续typeof (x) != 'undefined' && x != null;

如果您知道变量已声明但可能不存在,则可以使用

existy(elem) && doSomething(elem);

您正在检查的变量有时可能是嵌套属性。你可以使用 prop ||{} 继续检查相关属性的存在性:

var exists = ((((existy(myObj).prop1||{}).prop2||{}).prop3||{})[1]||{}).prop4;

在每个属性使用 (...' ||{}').nextProp,这样缺失的属性就不会引发错误。

或者你可以使用 existy likeexisty(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)

评论

0赞 Ry- 6/1/2019
如果你把它放在一个函数中,它是多余的。 等同于 when 被声明。typeof (x) != 'undefined' && x != nullx != nullx
11赞 de3 1/28/2016 #17

为了促进辩论,如果我知道变量应该是字符串或对象,我总是更喜欢,所以检查它是否是假的。这可以带来更干净的代码,例如:if (!variable)

if (typeof data !== "undefined" && typeof data.url === "undefined") {
    var message = 'Error receiving response';
    if (typeof data.error !== "undefined") {
        message = data.error;
    } else if (typeof data.message !== "undefined") {
        message = data.message;
    }
    alert(message); 
}

..可以简化为:

if (data && !data.url) {
  var message = data.error || data.message || 'Error receiving response';
  alert(message)
} 

评论

0赞 Demonblack 1/15/2018
这不是OP所要求的。如果 data.url 等于您的解决方案,则认为它未定义,而实际上它被定义为包含空字符串。''
1赞 de3 1/20/2018
我同意不是被问到的,你是对的:空字符串 '' 将被视为未定义。但我发布这个是因为我认为它可能对不同答案之间产生的辩论有用。在示例中,以及在许多其他情况下,如果确实有内容,您只想打印一个字符串,因此可以利用 javascript 认为 falsy 既是空字符串又是未定义的这一事实
42赞 RajeshKdev 2/19/2016 #18

当您执行简单的分配和相关检查时,还有另一种简短的方法可以检查这一点。只需使用条件(三元)运算符即可。

var values = typeof variable !== 'undefined' ? variable : '';

此外,当您尝试使用引用变量的实例赋值来声明全局变量时,这将很有帮助。

如果要检查变量不应为 或 。然后执行以下检查。undefinednull

当声明变量时,如果你想检查值,这甚至是 Simple:它将同时执行 undefinednull 检查。

var values = variable ? variable : '';

评论

0赞 mpag 5/6/2017
答案是完全错误的。typeof 变量始终返回一个字符串,因此从不为 false。例如,if is then is 和 always 。@John-Slegers 的答案与 typeof 的答案一样简短。typeof(booooo)"undefined"typeof(typeof boooooo)"string"typeof boooooo && truetrue
0赞 RajeshKdev 5/6/2017
这是绝对正确的答案这是一个工作中的小提琴。我不知道你在说哪种情况。问题是关于检查变量是否存在。
0赞 RajeshKdev 5/6/2017
@mpag 不要说平错了。证明这一点。发现错误真的很容易,相反,您可以在这里提供好的答案!!.如果答案是完全错误的,那么 28 个程序员如果不检查我的答案就不会投赞成票。由于这里有很多著名的答案,他们本可以投赞成票,而不是这个。
0赞 RajeshKdev 5/9/2017
其实第二段代码,就是不检查与上面一样的条件。我以为人们会通过这一行来理解,通过这条评论,它清楚地表明,它不执行变量声明检查。那就是检查变量值。If you wanted to check variable shouldn't be undefined or null.
1赞 Fareed Alnamrouti 5/30/2017
您的第二次检查将失败,值为 0
74赞 John Slegers 2/19/2016 #19

如何检查变量是否存在

这是一个非常无懈可击的解决方案,用于测试变量是否存在并已初始化:

var setOrNot = typeof variable !== typeof undefined;

它最常与三元运算符结合使用,以在某个变量尚未初始化的情况下设置默认值:

var dark = typeof darkColor !== typeof undefined ? darkColor : "black";

封装问题

不幸的是,您不能简单地将检查封装在函数中。

你可能会想到做这样的事情:

function isset(variable) {
    return typeof variable !== typeof undefined;
}

但是,如果您调用例如,这将产生引用错误。 并且变量尚未定义,因为您不能将不存在的变量传递给函数:isset(foo)foo

未捕获的 ReferenceError:未定义 foo


测试函数参数是否未定义

虽然我们的函数不能用于测试变量是否存在(由于上面解释的原因),但它确实允许我们测试函数的参数是否未定义:isset

var a = '5';

var test = function(x, y) {
    console.log(isset(x));
    console.log(isset(y));
};

test(a);

// OUTPUT :
// ------------
// TRUE
// FALSE

即使没有将 for 的值传递给函数,我们的函数在这种情况下也能完美地工作,因为在函数中被称为值。ytestissetytestundefined

13赞 Ferran Maylinch 4/6/2016 #20

为了检查变量是否已声明/设置,我做了这个肮脏的伎俩。

我还没有找到将代码提取到函数的方法,即使使用 .请参阅下面的评论以解释原因。eval

"use strict";

// var someVar;

var declared;
try {
  someVar;
  declared = true;
} catch(e) {
  declared = false;
}

if (declared) {
  console.log("someVar is declared; now has the value: " + someVar);
} else {
  console.log("someVar is not declared");
}

评论

0赞 Melab 1/26/2020
“将代码提取到函数中”是什么意思?
2赞 BallpointBen 1/26/2021
@Melab 理想情况下,您可以先调用 .但是没有办法安全地将一个潜在的未定义的变量传递给,因为在将变量传递给函数之前,必须对其进行评估,如果它尚不存在,那么此时它将抛出(在块之外,在函数)。您必须直接在块中计算变量,因此您不能将测试包装在函数中。function isDefined(x){...}isDefined(myVar)isDefinedtry/catchtry/catch
3赞 aross 1/6/2022
虽然这在技术上是一个很好的答案,但如果你真的需要这个,那将是糟糕设计的证据。
1赞 Aidan 6/28/2022
@aross 实际上你是对的,在我的代码中似乎有一个错误,但一定还有其他一些错误,因为几天后再回到它,它确实有效。
1赞 Michael G 12/11/2022
这是这里唯一的正确答案。我现在绝对需要这个,我一辈子都想不出如何测试它。检查变量是否存在会访问一个不存在的变量,这在某些时候是一个错误,这取决于你的浏览器决定以什么模式运行你的JavaScript,你无法从你的代码中检测到。:-/
5赞 Bekim Bacaj 12/27/2016 #21

这些答案(除了弗雷德·甘特的解决方案)都是不正确的或不完整的。

假设我需要 my 携带一个值,因此它已以一种方式声明,这意味着它已经初始化了;- 如何检查它是否已经声明?variableName;undefinedvar variableName;

或者更好的是 - 我如何通过一次调用立即检查“Book1.chapter22.paragraph37”是否存在,但不会产生引用错误?

我们通过使用最强大的 JasvaScript 运算符 in 运算符来做到这一点。

"[variable||property]" in [context||root] 
>> true||false

评论

0赞 user956584 1/7/2022
if ( (“url” in req.body) == false && req.body.url.length > 1
0赞 catwith 6/24/2022
对于用 和 代替 声明的变量,则不然。参见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...letconstvar
0赞 Bekim Bacaj 9/28/2022
@catwith,感谢您的输入,但是您在公开评论时应该考虑到,类似的事情不是一回事。var 是一个变量;是一个命题;const 与 var 完全相反,并且是 var 的对立面。该解决方案的编写是为了准确解决其明确请求中的问题。谢谢!
0赞 John Lord 5/20/2023
您能解释一下“让是一个命题”吗?事实上,您能解释一下为什么 W3Schools 将这三个变量称为具有不同限制级别的变量吗?示例:Var 声明一个变量。let 声明一个具有作用域的变量。Const 声明一个具有作用域的变量并防止重新赋值。当脚本(oracle)的创建者说它们不是时,您如何认为它们在某种程度上是完全不同的东西?
337赞 Alireza 9/1/2017 #22

在许多情况下,使用:

if (elem) { // or !elem

会为你做这项工作...这将检查以下情况:

  1. undefined:如果值未定义,则为undefined
  2. null:如果它为 null,例如,如果 DOM 元素不存在......
  3. 空字符串''
  4. 0:数字零
  5. NaN:不是一个数字

因此,它将涵盖所有情况,但总有一些奇怪的情况,我们也想涵盖这些情况,例如,带有空格的字符串,就像这个一样,这将在 javascript 中定义,因为它在字符串内有空格......例如,在本例中,您使用 trim() 再添加一个检查,例如:' '

if(elem) {

if(typeof elem === 'string' && elem.trim()) {
///

此外,这些检查仅适用于,因为对象和数组在 Javascript 中的工作方式不同,空数组和空对象始终为 true[]{}

我创建了下面的图像来显示答案的简要说明:

undefined, null, etc

评论

2赞 Thiago Yoithi 12/2/2017
@Alireza,很好!你的回答会帮助很多人。我已经记住了这些虚假的值,我唯一不确定的是 []。
38赞 ropo 11/19/2018
我收到“ReferenceError: elem is not defined”
4赞 Alireza 11/19/2018
@ropo,这是因为您甚至没有定义 elem 来检查它是什么,如果是您的情况,您需要使用已经提到的 typeof(elem)===“string” 来检查它......
53赞 Fanky 5/14/2019
那么当它说检查未定义时(虽然它返回未定义错误),答案是误导性的,不是吗?if(elem)
11赞 mhenry1384 11/22/2019
让我感到惊讶的是,赞成票的数量。答案是完全错误的。如上面的注释中提到的,“if (elem) {}” 不检查 undefined,如果未定义变量,它将抛出错误。但是,如果 elem 未定义,“if (window.elem) {}” 不会抛出错误。
1赞 Daniel 3/28/2019 #23

我很惊讶这还没有被提及......

以下是一些额外的变体,使用this['var_name']

使用此方法的好处是,可以在定义变量之前使用它。

if (this['elem']) {...}; // less safe than the res but works as long as you're note expecting a falsy value
if (this['elem'] !== undefined) {...}; // check if it's been declared
if (this['elem'] !== undefined && elem !== null) {...}; // check if it's not null, you can use just elem for the second part

// these will work even if you have an improper variable definition declared here
elem = null; // <-- no var here!! BAD!

评论

0赞 oligofren 9/24/2019
这是错误的。 定义并设置为一个值。您的答案无法检测到这与变量不存在之间的差异。如果你这样做了,它可能会起作用。window.bar=undefinedthis.hasOwnProperty('bar')
48赞 user2878850 5/11/2019 #24

测试变量未声明(不是未定义)的捷径是

if (typeof variable === "undefined") {
  ...
}

我发现它对于检测在浏览器外运行的脚本(没有声明变量)很有用。window

评论

0赞 Jason 7/18/2019
这是可移植的“规范方式”吗?
3赞 oligofren 9/24/2019
这是错误的。 定义并设置为一个值。您的答案无法检测到这与变量不存在之间的差异。如果你这样做了,它可能会起作用。window.bar=undefinedthis.hasOwnProperty('bar')
0赞 ha9u63a7 2/13/2020
此代码不起作用,您可以使用任何浏览器控制台进行验证
1赞 user2878850 3/6/2020
考虑。变量已定义,但返回 false...const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();x
48赞 Kamil Kiełczewski 5/17/2020 #25

尝试捕捉

如果根本没有定义变量(例如:尚未加载定义全局变量的外部库 - 例如谷歌地图),您可以使用 try-catch 块在不中断代码执行的情况下检查这一点,如下所示(您不需要模式)use strict

try{
  notDefinedVariable;
} catch(e) {
  console.log('detected: variable not exists');
}

console.log('but the code is still executed');

notDefinedVariable; // without try-catch wrapper code stops here

console.log('code execution stops. You will NOT see this message on console');

奖励:(参考其他答案)为什么比(来源=====)

如果( a == b )

Enter image description here

if( a === b )

Enter image description here

评论

17赞 johnsnails 5/29/2020
仅供参考,(a == b) 放在 Game of Life 网格上并不是那么令人兴奋。
4赞 shreyasm-dev 6/4/2020 #26

你可以试一试......catch 块,如下所示:

var status = 'Variable exists'

try {
  myVar
} catch (ReferenceError) {
  status = 'Variable does not exist'
}

console.log(status)

缺点是你不能把它放在函数中,因为它会抛出一个 ReferenceError

function variableExists(x) {
  var status = true
  try {
    x
  } catch (ReferenceError) {
    status = false
  }
  
  return status
}

console.log(variableExists(x))

编辑:

如果你在前端 Javascript 中工作,并且需要检查变量是否未初始化(将计为未初始化),您可以使用:var x = undefined

function globalVariableExists(variable) {
  if (window[variable] != undefined) {
    return true
  }
  
  return false
}

var x = undefined

console.log(globalVariableExists("x"))

console.log(globalVariableExists("y"))

var z = 123

console.log(globalVariableExists("z"))

编辑 2:

如果需要检查当前作用域中是否存在变量,只需将变量的名称以及字符串中包含的变量名称传递给函数:this

function variableExists(variable, thisObj) {
  if (thisObj[variable] !== undefined) {
    return true
  }
  
  return false
}

class someClass {
  constructor(name) { 
    this.x = 99
    this.y = 99
    this.z = 99
    this.v = 99
    
    console.log(variableExists(name, this))
  }
}

new someClass('x')
new someClass('y')
new someClass('z')
new someClass('v')
new someClass('doesNotExist')

4赞 John Lord 8/18/2020 #27
if (variable === undefined) {}

工作正常,只检查未定义。

0赞 HoldOffHunger 9/9/2020 #28

ReactJS 中,事情有点复杂!这是因为它是一个编译环境,自 [email protected]2018 年 10 月 1 日发布)以来遵循 ESLint 的 no-undef 规则。这里的文档对任何对这个问题感兴趣的人都很有帮助......

在 JavaScript 中,在 ES6 之前,变量和函数声明被提升到作用域的顶部,因此可以在代码中的正式声明之前使用标识符。

这个 [ES6] 的 [新] 规则在遇到对尚未声明的标识符的引用时会发出警告。

因此,虽然可以有一个(或“未初始化”)变量,但在不关闭 eslint 规则的情况下,不可能在 ReactJS 中有一个未声明的变量。undefined

这可能非常令人沮丧——GitHub 上有很多项目只是利用了 ES6 之前的标准;而直接编译这些而不进行任何调整基本上是不可能的。

但是,对于 ReactJS,您可以使用 .如果你有一个未声明的变量,比如...eval()

if(undeclaredvar) {...}

您可以简单地将这部分重写为...

if(eval('typeof undeclaredvar !== "undefined"')) {...}

例如。。。

if(eval("false")) {
  console.log("NO!");
}
if(eval("true")) {
  console.log("YEAH!");
}

对于那些将 GitHub 存储库导入 ReactJS 项目的人来说,这只是检查变量是否声明的唯一方法。在结束之前,我想提醒您,如果使用不当,eval() 存在安全问题

1赞 Trevor 2/25/2021 #29

我更喜欢这种方法,因为它的准确性和简洁性:

var x
if (x === void 0) {
  console.log(`x is undefined`)
} else {
  console.log(`x is defined`)
}

正如在其他评论和答案中提到的,不能保证是未定义的。由于它不是关键字,因此可以将其重新定义为全局范围以外的作用域中的变量。这里有一个小例子可以证明这种细微差别:undefined

var undefined = 'bar'
console.log(`In the global scope: ${undefined}`)

function foo() {
  var undefined = 'defined'
  var x
  if (x === undefined) {
    console.log(`x === undefined`)
  } else {
    console.log(`x !== undefined`)
  }
  if (x === void 0) {
    console.log(`x === void 0`)
  } else {
    console.log(`x !== void 0`)
  }
}

foo()

有关兼容性,请参阅 void(在 IE5 中受支持?!!哇!

评论

0赞 mckeed 7/24/2022
这有什么优势吗?重新定义不会影响它,不是吗?typeof x === 'undefined'undefined
0赞 Trevor 7/24/2022
我不认为重新定义会对 产生任何影响,因为您实际上并没有引用关键字。undefinedtypeof x === 'undefined'undefined
0赞 Praveen Kumar 1/27/2022 #30

为了使条件正常工作,我们必须使用关键字来创建变量。iflet

let name = undefined; 
if (name) { 
    alert('valid')
};
2赞 Peter Whittaker 10/21/2022 #31

我想要类似的东西:一个函数来检查变量是否有值,其中 0 很有用,但空字符串、数组和对象没有(对于我的应用程序)。根据各种答案和评论,我想出了下面定义和测试的功能;它返回测试值的前半部分和后半部分,这是我想要和需要的:usefulisSet()truefalse

let fn = [1234, "1234", 0, "0", [1,2], {name: "number"}, "", [], {}, null, NaN, undefined]

console.log(fn)
const isSet = (val) => {
    switch (typeof val) {
        case 'number': return !isNaN(val); break; // as long as it is a number other than NaN....
        case 'string': return val.length > 0; break;
        case 'undefined': return false; break;
        case 'object':
            if (val === null) return false;
            else return Object.keys(val).length > 0;
            break;
    }
}

for (index in fn) {
    const item = fn[index];
    console.log(`ind: ${index}; ${typeof item}; ${isSet(item)}`)
}

结果(下):node v16.16.0

[
  1234,
  '1234',
  0,
  '0',
  [ 1, 2 ],
  { name: 'number' },
  '',
  [],
  {},
  null,
  NaN,
  undefined
]
ind: 0; number; true
ind: 1; string; true
ind: 2; number; true
ind: 3; string; true
ind: 4; object; true
ind: 5; object; true
ind: 6; string; false
ind: 7; object; false
ind: 8; object; false
ind: 9; object; false
ind: 10; number; false
ind: 11; undefined; false