题 如何确定变量是“未定义”还是“空”?


如何确定变量是否为 undefined 要么 null?我的代码如下:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  //DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

但是如果我这样做,JavaScript解释器会暂停执行。


1610
2018-04-15 18:12


起源


我们可以提名这个问题被锁定吗?我没有足够的代表。 @tats_innit - Aerovistae
@Aerovistae只有<>钻石版主可以手动锁定和解锁stackoverflow帖子: meta.stackexchange.com/questions/22228/...  :) - Tats_innit


答案:


你可以使用的质量 抽象平等算子 去做这个:

if (variable == null){
    // your code here.
}

因为 null == undefined 是的,上面的代码将同时捕获 null 和 undefined


2201
2018-04-15 18:14



if (typeof variable === 'undefined' || !variable) { /* do things */ }; 这对我有用 - Ansd
@Ansd你的解决方案不是独家的 undefined 要么 null。 !variable 对于任何虚假价值都是如此: '', 0, false, null, undefined等 - Douglas Ludlow
有没有解释为什么'=='有效,'==='没有?我查看了meta中的编辑线程,但我不明白为什么这个答案无法从解释为什么'=='在这里使用以及它如何工作中受益。 - LucyMarieJ
我回答了自己的问题。道歉。我在这里找到了答案: stackoverflow.com/questions/5101948/...  对于任何有同样困惑的人。 - LucyMarieJ
是否有任何旧的浏览器可能会失败? - donquixote


捕获的标准方法 null 和 undefined 同时是这样的:

if (variable == null) {
     // do something 
}

- 这是100%相当于更明确但不简洁:

if (variable === undefined || variable === null) {
     // do something 
}

在编写专业JS时,理所当然地认为[类型相等和行为 == VS ===] [1]被理解。因此我们使用 == 并且只与...比较 null


再次编辑

评论建议使用 typeof 很简单 错误。 是的,如果变量不存在,我上面的解决方案将导致ReferenceError。 这是件好事。 这个ReferenceError是可取的:它可以帮助您在发布代码之前找到错误并修复它们,就像其他语言中的编译器错误一样。

您不应该在代码中引用任何未声明的变量。


911
2018-01-22 03:01



如果在代码中未定义或引用变量,则会导致ReferenceError并中断执行,使用typeof更安全。 - Mani Gandham
这更像是一种风格。如果变量尚未声明 所有,这真的只是作者的糟糕写作。您应该知道您的变量是否已被声明,这不应该是一个问题。但 是如果是的话 一些原因 在这种情况下,应该改为 window.variable 而不仅仅是 变量,这不会引起参考错误。应该避免使用类型。 - Aerovistae
是的,因为你写了 !== 代替 !=。 - Aerovistae
-OP:关于那些比较为“100%等效”的声明是简单的错误,正如您在自己的编辑中所指出的,第二个将导致ReferenceError。关于断言:“你不应该在代码中引用未声明的变量。”真?听说过可选参数吗? jsfiddle.net/3xnbxfsu - Timothy Kanski
如果可选地未提供@TimothyKanski可选参数,则它们可能是未定义的,但它们绝对是声明的变量。它们被声明并具有值 undefined,如任何已声明但未初始化的变量,即 var someVar; 所以你的论点并没有真正成立 - chiliNUT


if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

177
2018-04-15 18:25



万一有人认为这是另一个半答案,这实际上确实有效。 undefined 评估等于 null。 - Chuck
在chrome控制台中我失败了... ReferenceError:变量没有定义,所以它可能有用,但不适合我...... - Eran Medan
它仅适用于声明的变量,而不适用于可能会或可能不会声明的变量,这种情况很少发生。 (对于那种情况,你需要使用typeof + null检查)
只是 想通了 你可以添加这个评论: /*jshint eqnull:true */ 在JS文档或函数的顶部,JSHint将停止警告您使用它 == null。 - Web_Designer
@Aerovistae你能指点我明确指出的那个 == 被打破。强制性的 if(variable == null) 在这个答案中对我完全有意义...... - Ben


结合上述答案,似乎最完整的答案是:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

这适用于任何未声明或声明的变量,并显式设置为null或undefined。对于具有实际非空值的任何声明变量,布尔表达式应该求值为false。


162
2017-10-11 17:02



@Aerovistae我认识到了这一点 typeof 是一个操作符,而不是一个函数,因此它不需要括号,但我仍然欣赏括号 - 只是为了清晰起见。 - user664833
怎么样直接检查if(变量=== undefined)而不是使用typeof? - Arjun U.
@ArjunU如果未声明变量,将导致ReferenceError。如果您不知道是否声明了变量,请使用上述解决方案。如果您可以保证至少声明变量,则可以使用 variable == null - Rogue
这是一个更好的解决方案,因为@Rogue指出,可能不会声明变量。 - Abdul Sadik Yalcin
如果我错了,请纠正我,但不是第一个有条件的第二个超集,因此第二个条件是多余的? - March Ho


if (typeof EmpName != 'undefined' && EmpName) {

如果值不是,则评估为真:

  • 空值

  • 未定义

  • 为NaN

  • 空字符串(“”)

  • 0


75
2018-05-07 07:24



我认为这是一种像野火一样蔓延的危险技术。因为检查的很多变量可能是布尔值或数字。因此,如果用户没有完全理解后果,那就不好了。 - usefulBee
请提供此javascript especification的参考 - villamejia
这是一样的 if (EmpName)。如果它是 undefined 已经是假的了。 - Rudy
如果未定义变量。那么如果(EmpName)会抛出错误 - Thamaraiselvam
@Thamaraiselvam我认为鲁迪可能就是这个意思 var EmpName; if (EmpName)。定义变量但未赋值的位置。 - hungerstar


jQuery的 attr() 函数返回空字符串或实际值(永远不会 null 要么 undefined)。它唯一的回归时间 undefined 是你的选择器没有返回任何元素。

所以你可能想测试一个空字符串。或者,由于空字符串(null和undefined)为false-y,因此您可以这样做:

if (!EmpName) { //do something }

20
2018-04-15 18:20



Chrome 17.0.963.78 m给出了以下错误: ReferenceError: EmpName is not defined - Eran Medan
@EranMedan我知道这已经很晚了,但它有望帮助后来到这里的人们。您收到错误的原因是因为它根本没有被声明。通常你会将EmpName(或其他一些变量)传递给一个函数,或者另一个函数的返回值并因此声明(例如:“var x;”)。要测试它是否返回undefined,null或空字符串,您可以使用上述解决方案。 - Dave


我喜欢用这个:

if (!!variable) {
   //do something
}

它捕获了两者 空值 和 未定义


13
2017-09-16 08:35



!! 返回false为 null 要么 undefined。所以这个if只会在变量不为null或未定义时运行。 - Dan
var d = 0; 会失败的 !!d 评估为假 - ainesophaur
这也“捕获”空字符串, 0, NaN,和 false。答案完全错误。 - Aerovistae
Downvoted,因为这个答案正在毒化StackOverflow知识库。 - mickmackusa


如果要检查的变量是全局变量,请执行

if (window.yourVarName) {
    // Your code here
}

即使这样,这种检查方式也不会抛出错误 yourVarName 变量不存在。

示例:我想知道我的浏览器是否支持History API

if (window.history) {
    history.back();
}

这是如何工作的:

window 是一个将所有全局变量保存为其属性的对象,在JavaScript中尝试访问不存在的对象属性是合法的。如果 history 那时候不存在 window.history 回报 undefinedundefined 是falsey,所以代码在 if(undefined){} 块不会运行。


9
2018-02-10 16:30



读者应该注意,这样的方法是用于检查的惯用语 - 从浏览器中运行的JavaScript - 是否 全球 已声明变量,尤其是浏览器提供的全局(如历史API)是否可用。它 不管用 用于检查非全局变量是否为 null 要么 undefined如果您的JavaScript在浏览器外部运行(即在Node.js中),它也不会起作用。它还将处理全局变量 0, false 要么 '' 与未申报或未申报的相同 undefined 要么 null,这通常很好。 - Mark Amery
这假定脚本在浏览器中运行。那不是给定的。 - GreenAsJade