我该如何确定一个变量是“未定义”还是“空值(null)”?

2663

如何判断变量是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解释器会停止执行。


可能是如何在JavaScript中检查空字符串?的重复问题。 - T.Todua
使用内置的空值合并运算符(??) - Dennis Nolan
@DennisNolan 这个问题是在2010年提出的。 - not my real name
如果(EmpName == 'undefined')将不会测试EmpName是否未定义,它将测试字符串“undefined”,因此去掉那些单引号:如果(EmpName == undefined)//因为没有引号的'undefined'是未定义的或者更简单的如果(!EmpName){ // 做一些事情 }; - user7394313
35个回答

3518
您可以使用抽象相等运算符的特性来完成这个任务:
if (variable == null){
    // your code here.
}

由于 null == undefined 为真,因此上面的代码将捕获 nullundefined


9
我试图在火狐浏览器中测试事件是否为空,但是出现了一个错误并阻止了执行:"event未定义"。 - Entretoize
5
@MichaelFever 怎么会不起作用呢?复制并粘贴以下内容到你的控制台:const y = undefined; y == null; 它应该返回 true - Seraf
3
在你的评论示例中,你声明了y是常量,但是你进行的比较却是 abc(而不是 y)。当我在Chrome和Firefox上通过console.log(y == null);测试y时,得到的结果是true。如果你遇到了错误,那么可能是因为你尝试使用赋值运算符=而不是比较运算符==,这会导致错误,因为const不能被重新赋值。 - Pshemo
6
可能会有些棘手: undefined !== null --> true undefined == null --> true - d.popov
4
以下是相关比较的实时示例。lgtm。 - Ryan Haining
显示剩余9条评论

1371

同时捕获nullundefined的标准方法如下:

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

--这与更加详细但不够简洁的表述完全等效:

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

在编写专业的JS时,类型相等和=====的行为被视为理所当然。因此,我们使用==并仅与null进行比较。


再次编辑

建议使用typeof的评论是错误的。是的,我上面的解决方案会在变量不存在时引发ReferenceError。 这是一件好事。 这个ReferenceError是可取的:它将帮助您在发布代码之前找到并修复错误,就像其他语言中的编译器错误一样。如果您正在处理无法控制的输入,请使用try/catch

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


55
如果代码中未定义或根本未引用变量,这将导致ReferenceError并中断执行,使用typeof更安全。 - Mani Gandham
79
这更多是一个风格上的问题。如果变量根本没有被声明,那只能说明作者写作不好。你应该知道你的变量是否被声明了,这不应该是一个问题。但是,如果因为某种原因确实是这种情况,应该将variable改为window.variable,这样不会引起引用错误。应避免使用typeof。 - temporary_user_name
10
“关于这些比较是'100%等价的'的说法是完全错误的,正如你在自己的编辑中指出的那样,第二个会导致ReferenceError。至于断言:“您不应该在代码中有任何对未声明变量的引用。”真的吗?听说过可选参数吗?” - Timothy Kanski
25
如果可选参数没有被提供的话,它们可能是未定义的,但它们绝对是已声明的变量。它们被声明了并且有一个值为 undefined 的值,就像任何已声明但未初始化的变量一样,例如 var someVar;。因此,你的论点并不成立。 - chiliNUT
7
if (variable)测试真值。它将同时除去false0NaN和空字符串以及nullundefined,因此它不是正确的答案。至于instanceof,如果问题是“这个变量是null还是undefined?”(也许您希望该值为nullundefined...)您不能用instanceof来确定,除非通过检查该值不是任何其他类型的实例,这很疯狂。因此,在这里也是错误的答案。 - temporary_user_name
显示剩余22条评论

298

综合以上答案,似乎最完整的答案应该是:

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

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


2
@Aerovistae 我知道 typeof 是一个运算符而不是函数,所以它不需要括号,但我仍然感谢括号——因为它可以提高代码的可读性。 - user664833
1
直接检查变量是否为undefined,而不使用typeof,怎么样? - Frozen Crayon
4
如果变量未声明,则会引发ReferenceError。如果您不确定变量是否已声明,请使用上述解决方案。如果您可以保证变量至少已声明,则可以使用variable == null - Rogue
3
这是一个更好的解决方案,因为正如 @Rogue 指出的那样,该变量可能未被声明。 - Abdul Sadik Yalcin
我只使用了第一部分 if( typeof variable === 'undefined' ){},因为添加 null 部分会抛出 ReferenceError。 - Uriahs Victor
显示剩余3条评论

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

15
以防万一,如果有人认为这只是另一个不完整的答案,实际上它是可行的。undefined等于null - Chuck
4
在Chrome控制台中出现错误...引用错误:变量未定义,因此它可能有效,但对我无效... - Eran Medan
52
它仅适用于已声明的变量,而不适用于可能已声明或未声明的变量,这种情况很少发生。(您需要使用 typeof + 空值检查来处理这种情况) - user216441
11
刚刚发现你可以在JS文档或函数的顶部添加此注释:/*jshint eqnull:true */,JSHint将停止警告您对== null的使用。 - Web_Designer
3
@Aerovistae,你能给我提供一个明确说明==是有问题的参考文献吗?这个回答中使用强制类型转换的if(variable == null)完全符合我的理解... - Ben Aston
显示剩余6条评论

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

如果值不是以下值之一,则将求值为true:

  • null

  • undefined

  • NaN

  • 空字符串("")

  • 0

  • false


16
我认为这是一种像野火一样蔓延的危险技术。因为被检查的许多变量可能是布尔值或数字。所以如果用户不完全了解后果,这是不好的。 - usefulBee
2
这与 if (EmpName) 相同。如果是 undefined,它已经是假值了。 - Rudy
2
如果变量未定义,则 if(EmpName) 将会抛出错误。 - Thamaraiselvam
1
@Thamaraiselvam 我认为Rudy可能是指这个var EmpName; if (EmpName)。 这里变量被定义但没有赋值。 - hungerstar
@DavidKnipe 如果变量在代码中没有定义或根本没有引用,那么会导致ReferenceError并中断执行,使用typeof更安全。如果它是SaaS,则没有问题,如果它是自托管的应用程序,则修复错误就会变得混乱。 - Thamaraiselvam
显示剩余4条评论

56

可能最简单的方法是:

if(EmpName == null) { /* DO SOMETHING */ };

这里有证据:

function check(EmpName) {
  if(EmpName == null) { return true; };
  return false;
}

var log = (t,a) => console.log(`${t} -> ${check(a)}`);

log('null', null);
log('undefined', undefined);
log('NaN', NaN);
log('""', "");
log('{}', {});
log('[]', []);
log('[1]', [1]);
log('[0]', [0]);
log('[[]]', [[]]);
log('true', true);
log('false', false);
log('"true"', "true");
log('"false"', "false");
log('Infinity', Infinity);
log('-Infinity', -Infinity);
log('1', 1);
log('0', 0);
log('-1', -1);
log('"1"', "1");
log('"0"', "0");
log('"-1"', "-1");

// "void 0" case
console.log('---\n"true" is:', true);
console.log('"void 0" is:', void 0);
log(void 0,void 0); // "void 0" is "undefined" 

以下是关于==的更多细节(来源在这里)

输入图像描述

BONUS: 为什么=====更清晰(请看agc的回答)

输入图像描述


谢谢,非常好的回答!那么像 if(var) 或者 if(!var) 这样的表达式呢? - IceFire
@IceFire 举个例子,if(var)/if(!var) 将会执行 true/false 值的代码。而 if(var == null) 对于那些值为 null 的变量永远不会执行代码... - Kamil Kiełczewski
1
这很简单,但是上面的矩阵之一是否也可以用来检查不同值的if表达式产生了什么结果? - IceFire
@IceFire,在我的回答中有指向这些图片来源的链接 - 那里也有一个名为“matrix”的if语句。 - Kamil Kiełczewski

33

jQuery的 attr() 函数返回一个空字符串或实际值(从不返回nullundefined)。仅当选择器未返回任何元素时才返回undefined

因此,您可能希望针对空字符串进行测试。或者,由于空字符串、null和undefined都是假值,您可以只需执行以下操作:

if (!EmpName) { //do something }

2
Chrome 17.0.963.78 m 给出了这个错误:ReferenceError: EmpName未定义 - Eran Medan
10
@EranMedan 我知道有些晚了,但希望可以对后来的人有所帮助。你遇到错误是因为变量从未声明。通常会将EmpName(或其他变量)传递给一个函数,或者作为另一个函数的返回值而被声明(例如:“var x;”)。如果要测试它是否返回undefined、null或空字符串,可以使用上述解决方案。 - Dave
我知道这是一个冷酷的问题,但是如果元素上不存在该属性(不仅仅是选择器没有匹配的元素),jQuery将返回undefined。例如,一个没有srcimg将为$('img').attr('src');返回undefined - codinghands

28
< p > < em > 修改后的答案 :我的意见是,您不应该使用我下面旧答案中的函数。相反,您应该了解您的变量类型并直接使用相应的检查(例如,想知道数组是否为空?只需执行if(arr.length === 0){}等)。 这个答案甚至没有回答OP的问题。


我自己写了一个函数来解决这个问题。 JavaScript很奇怪。

它可以用于任何东西。(请注意,这也检查变量是否包含任何可用的值。但由于通常也需要此信息,因此我认为值得发布)。 请考虑留言。

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

与 TypeScript 兼容。


此函数应该完全像 PHP 的 empty() 函数 (参见 RETURN VALUES) 执行相同的操作。

undefinednullfalse00.0"0"{}[] 视为为空。

"0.0"NaN" "true 视为非空。


2
我遇到了一个小的空值检查问题。我想检查传递的参数是否为null或空对象{}。这是一个常见而愚蠢的语言问题,但我忘记了它。我的所有搜索都显示undefined或null值的答案,或者松散相等比较(==),但不是严格相等(===)或等效的。然后,在您排名第-1的答案中,就在页面的最底部(在我点赞之前)找到了我所寻找的答案。Object.keys(obj).length < 1或者也许是===0,假设它永远不会是-1。无论如何,点赞到0,woo。:p - user2895783
谢谢,我已经成功地将这个函数插入并清理了很多代码。为什么这不是标准的JS函数,我无法理解。 - Andy
4
在这里,你应该将所有的==改为===,这样这个函数就会合理一些。 - Ben McIntyre

24

最简单最易懂的方法:

if(!EmpName ){
 // DO SOMETHING
}

如果EmpName是以下情况之一,则此代码将返回true:

  • null
  • undefined
  • NaN
  • 空值
  • 字符串("")
  • 0
  • false

3
这里的用例是我想知道undefined和false之间的区别。我将使用对null的检查。 - gast128

15

如果您想要检查的变量是全局变量,请执行以下操作:

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

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

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

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

这是如何工作的:

window 是一个对象,它包含所有全局变量作为其属性,在 JavaScript 中,尝试访问不存在的对象属性是合法的。如果 history 不存在,则 window.history 返回 undefined。由于 undefined 是假值,因此在 if(undefined){} 块中的代码将不会运行。


3
请注意,像这样的方法通常用于检查 JavaScript 在浏览器中运行时(通过全局变量)是否已经声明,并特别用于检查浏览器提供的全局变量(例如历史记录 API)是否可用。但这种方法 不能 用于检查非全局变量是否为 nullundefined,也无法在 JavaScript 在浏览器外部(如 Node.js 中)运行时使用。此外,它会将设置为 0false'' 的全局变量与未声明或 undefinednull 的变量视为相同,这通常是可以接受的。 - Mark Amery
这假设脚本正在浏览器中运行。但这并不是一定的。 - GreenAsJade

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接