我该如何确定一个变量是“未定义”还是“空值(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个回答

13

据我所知,在JavaScript中,我们可以像下面这样检查一个未定义的null变量。

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

检查所有条件:

if(variable === undefined || variable === null || variable === ''){
}

1
var is a reserved word, this will throw SyntaxError - dhilt
@dhilt 将从 var 到 variable 进行了实现。 - Hardik Desai

10

由于您正在使用 jQuery,因此可以使用一个函数来确定变量是未定义还是其值为 null。

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

这对我没有用。第一个示例仍然出现错误:“ReferenceError:s未定义”。 - Mark

10

9

我刚遇到了这个问题,即如何检查对象是否为空。
我只是使用了这个:

if (object) {
    // Your code
}
例如:
if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
最好将变量A设置为document.getElementById("enterJob"), 如果存在A,则将A.className加上'current'类名。 这样做可以用50%的工作获得相同的结果……但也许您只是为了展示而这样做,那我向您致敬。 - Harry Svensson

7

随着最新的JavaScript变化,你可以使用新的逻辑运算符??=来检查左操作数是否为nullundefined,如果是,则将右操作数的值赋给它。

所以,

if(EmpName == null){  // if Variable EmpName null or undefined
  EmpName = 'some value';
};

等价于:

EmpName ??= 'some value';

5

jQuery检查元素是否为null:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

4

最简单的检查方法是:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
如果变量的值为“false”,则将执行此代码,这可能是不希望发生的。 - byxor
问题很清楚:“如何确定变量是'undefined'还是'null'?”在JavaScript中,如果一个变量的值为null或undefined,则其值为false。 - M. Arnold
2
抱歉,但那不正确。这里有一个 JSFiddle 来证明它。 - byxor
通过你的回答,undefinednull和一些其他的东西,如空字符串、+0、-0、NaNfalse都可以通过。!运算符强制操作数(这里是variable)转换为布尔值:https://www.ecma-international.org/ecma-262/#sec-toboolean - Alireza
但是请注意问题:“如何确定变量是否未定义或为空”,在if语句中使用!操作符,如果变量为null或undefined,则始终返回true。 - M. Arnold

4
似乎还没有人发布过这个,所以我们来试一试:
a?.valueOf() === undefined 对于 null 或 undefined 都是可靠的。
以下代码与 a==null 或 a==undefined 差不多,但对于那些不喜欢 == 的纯粹主义者来说,它可能更有吸引力。

function check(a) {
  const value = a?.valueOf(); 
  if (value === undefined) {
    console.log("a is null or undefined");
  }
  else {
    console.log(value);
  }
}

check(null);
check(undefined);
check(0);
check("");
check({});
check([]);

顺便提一下,a?.constructor 也可以使用:

function check(a) {
  if (a?.constructor === undefined) {
    console.log("a is null or undefined");
  }
}

check(null);
check(undefined);
check(0);
check("");
check({});
check([]);


更新:我们与StackOverflow的一位成员一起找到了更好的方法

我个人会这样做:

if (Object.is(a ?? null, null)) {
  // a is null or undefined
}

"a?.valueOf() === undefined 可靠地工作".... 呃, a = {valueOf() {}} - Константин Ван
是的,你也应该提到 a = Object.create(null),这可能是一件不那么愚蠢但同样无用的事情。它不是人类可能会错误引入的 bug,必须是有意为之。否则,没错,它是 JavaScript,你可以随心所欲地进行黑客攻击。 - noseratio - open to work

3

使用以下解决方案:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

我可以检查以下内容:
  • null (空值)
  • undefined (未定义)
  • NaN(非数值)
  • empty(空字符串)
  • string(""空字符串)
  • 0 (零)
  • false (假)

这并没有回答问题,问题是“如何捕获null和undefined?”而不是“如何捕获JavaScript中的每个falsey值?” - temporary_user_name
@Aerovistae,我认为我已经用console.log(isDeepEqual(null, null));和console.log(isDeepEqual(undefined, undefined));测试过了吧? - Tony Tai Nguyen

3
如果你创建一个用于检查它的函数:
export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

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