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


Answers:


2846

您可以使用抽象相等运算符的品质来做到这一点:

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

因为null == undefined为true,所以上面的代码将同时捕获nullundefined


5
我正在尝试测试firefox中的event是否为null以及是否有错误阻止执行:“未定义事件”
Entretoize

3
@MichaelFever那怎么不起作用?将其复制粘贴到您的控制台中:const y = undefined; y == null;应该返回true
Seraf

2
@ChrisStryczynski在您的注释示例中,您声明了y常量,但是您要比较abc(不是y)。当我在Chrome和Firefox上y通过测试时,console.log(y == null);得到了true结果。如果遇到错误,则可能是尝试使用赋值运算符=而不是比较==,这将导致返回错误,因为const无法重新赋值。
Pshemo '19

2
相关比较的实时示例。lgtm。
瑞安·海宁

2
@ZaytsevDmitry为什么您期望测试变量是否为nullundefined变量相等时通过0?问题不在于测试真实值,而在于明确测试nullundefined
rodrigo-silveira

1106

捕获nullundefined同时进行的标准方法是:

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

-100%等同于更明确但不太简洁的代码:

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

编写专业JS时,理所当然的是类型相等,并且=====可以理解vs 的行为。因此,我们==仅使用和进行比较null


重新编辑

暗示使用的评论typeof是完全错误的。是的,如果变量不存在,上述解决方案将导致ReferenceError。这是一件好事。此ReferenceError是可取的:它将帮助您发现错误并在交付代码之前解决它们,就像其他语言中的编译器错误一样。如果使用输入,则无法使用try/ catch进行控制。

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


47
如果未在代码中定义或引用变量,则使用typeof更安全,这将导致ReferenceError并中断执行。
Mani Gandham 2014年

56
这更多的是风格问题。如果变量尚未在宣布所有,这是对作者的部分其实只是写不好。您应该知道您的变量是否已声明,这不应该是一个问题。但是,是的,如果由于某些原因,应该将其更改为window.variable而不是variable,这不会导致引用错误。应该避免Typeof。
临时用户名

6
是的,因为您写的!==不是!=
临时用户名

9
-OP:正如您在自己的EDIT中指出的那样,关于那些比较为“ 100%等效”的语句很简单,第二个语句将导致ReferenceError。至于断言:“您的代码中不应有对未声明变量的任何引用。” 真?听说过可选参数吗? jsfiddle.net/3xnbxfsu
Timothy

16
如果没有可选地提供@TimothyKanski可选参数,则它们可能是未定义的,但它们绝对是声明的变量。undefined正如任何已声明但未初始化的变量一样,它们被声明并具有值,即,var someVar;因此您的论点并没有真正成立
chiliNUT

227

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

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

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


2
@Aerovistae我认识到这typeof是一个运算符,而不是一个函数,因此它不需要括号,但是尽管如此,我还是很欣赏括号的-只是为了阅读清楚。
user664833 2014年

1
直接检查if(variable === undefined)而不使用typeof怎么办?
冰冻的蜡笔》 2015年

2
@ArjunU,如果未声明变量,将导致ReferenceError。如果您不知道是否声明了变量,请使用上述解决方案。如果可以保证至少声明了该变量,则可以使用variable == null
Rogue

3
这是一个更好的解决方案,因为正如@Rogue指出的那样,可能不会声明该变量。
阿卜杜勒·萨迪克·雅尔辛

如果我错了,请纠正我,但是第一个条件不是第二个条件的超集,因此第二个条件是多余的吗?
2013年

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

14
万一有人认为这是另一半答案,那实际上是可行的。undefined等于null
Chuck

3
在chrome控制台中对我失败... ReferenceError:未定义变量,所以它可能起作用,但不适用于我...
Eran Medan 2012年

48
它仅适用于已声明的变量,不适用于可能会或可能不会声明的变量,这种情况很少发生。(对于这种情况,您需要使用typeof +空检查)

11
弄清楚,您可以/*jshint eqnull:true */在JS文档或函数的顶部添加以下注释:,JSHint将停止警告您使用== null
Web_Designer 2013年

3
@Aerovistae您能带我指向一个明确指出==已损坏的参考。if(variable == null)这个答案中的强制性对我来说完全有意义...
Ben Aston

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

如果值不是,则将评估为true:

  • 空值

  • 未定义

  • N

  • 空字符串(“”)

  • 0


13
我认为这是一种危险的技术,像野火一样蔓延开来。因为检查的许多变量可能是布尔值或数字。因此,如果用户不完全了解后果,那就不好了。
有用蜜蜂

请提供此javascript规范的参考-villamejia
2016年

1
这与相同if (EmpName)。如果undefined已经是虚假的。
鲁迪

如果未定义变量。则if(EmpName)将引发错误
Thamaraiselvam

1
@Thamaraiselvam我认为Rudy可能是这个意思var EmpName; if (EmpName)。定义变量但未分配值的位置。
hungerstar '16

27

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

因此,您可能要针对空白字符串进行测试。另外,由于空白字符串,null和undefined为false-y,因此您可以执行以下操作:

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 m给出此错误:ReferenceError: EmpName is not defined
Eran

6
@EranMedan我知道这已经晚了,但是希望它将对以后来这里的人们有所帮助。出现错误的原因是因为它根本没有被声明。通常,您需要将EmpName(或其他变量)传递到一个函数中,或者将另一个函数的返回值传递给它,并因此进行声明(例如:“ var x;”)。要测试它是否返回未定义,空值或空白字符串,可以使用上述解决方案。
戴夫

我意识到这是一个很棘手的问题,但是undefined如果该属性在元素上不存在,jQuery将返回(不仅仅是根据选择器,如果选择器没有匹配的元素)。例如,img没有src就返回undefined$('img').attr('src');
codinghands

19

我来为此编写自己的函数。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检查问题。我想检查传递的参数是否为null或空对象{ }。这是一个常见且愚蠢的语言问题,但我已经忘记了。我所有的搜索都显示未定义的空值或宽松的相等比较(==)的答案,但没有严格的相等(===)或等效的答案。然后,在页面最底部(在我投票之前),您在-1排名中的答案就是我无法回答的答案。 Object.keys( obj ).length < 1或=== 0(假设永远不会为-1)。无论如何,提高到0,求爱。:p

谢谢,我已经能够使用此功能并清理大量代码。为什么这不是标准的JS函数,这超出了我的范围。
安迪

3
你应该改变所有的你=====这里,那么这将是一个合理的功能。
Ben McIntyre

12

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

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

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

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

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

工作原理:

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


2
读者应注意,从浏览器中运行的JavaScript来看,这种方法是惯用的,即是否声明了全局变量,尤其是是否提供了浏览器提供的全局变量(如历史API)。它不会工作用于检查非全局变量是否为nullundefined,如果您的JavaScript在浏览器外部(即在Node.js中)运行,则也将不起作用。它也将把全局设置0false还是''一样的那些未声明或undefinednull,通常是罚款。
Mark Amery 2015年

假设脚本正在浏览器中运行。那不是给定的。
GreenAsJade '16

12

最短和最容易的:

if(!EmpName ){
 // DO SOMETHING
}

如果EmpName为:

  • 空值
  • 未定义
  • N
  • 空的
  • 字串(“”)
  • 0

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

11

可能最简单的方法是:

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

这是证明:

这是有关==在此处提供资源)的更多详细信息

在此处输入图片说明

奖金:为什么===比以下更清楚==(在agc答案上查看)

在此处输入图片说明


8

我只是有这个问题,即检查对象是否为空。
我只是用这个:

if (object) {
    // Your code
}

例如:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
最好设置var A = document.getElementById(“ enterJob”)if(A)A.className + ='current'; 这样,您就可以为相同的结果完成50%的工作...但是也许您只是为表演而做,然后我向您致敬。
哈里·斯文森

7

由于您使用的是jQuery,因此可以使用单个函数来确定变量是未定义的还是其值为空。

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 is not defined对于第一个示例。
2016年

5

jQuery check元素不为null:

var dvElement = $('#dvElement');

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

4

据我所知,在JavaScript中,我们可以检查未定义的,null或空变量,如下所示。

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

检查所有条件:

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

var是保留字,这将引发SyntaxError
dhilt

4

您可以简单地使用以下代码(我知道这样做的方法更短,但是至少对于其他查看代码的人来说,这样做可能更容易从视觉上观察)。

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

3

最简单的检查方法是:

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

1
如果变量的值为,这将执行代码false,这可能是不希望的。
byxor19年

问题很明确:“如何确定变量是'undefined'还是'null'?” 并且在javascript中,如果变量的值为null或undefined,则其值为false。
M. Arnold

1
抱歉,那是不对的。这是一个JSfiddle来证明这一点。
byxor

通过你的答案undefinednull 以及一些其他的东西像空字符串,+ 0,-0 NaN,并false获得通过。!运算符将操作数强制转换variable为布尔值:ecma-international.org/ecma-262/#sec-toboolean
Alireza,

但是,请检查以下问题:“如何确定变量是未定义的还是空的”!如果变量为null或未定义,则与if一起使用的操作数将始终返回true。
阿诺德先生(M. Arnold)

2

使用以下解决方案:

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...

我可以检查以下内容:

  • 空值
  • 未定义
  • N
  • 空的
  • 字串(“”)
  • 0

这不能回答“我如何捕获null和undefined”这个问题。不是“如何捕获JavaScript中的所有虚假值?”
临时用户名

@Aerovistae,我以为我使用console.log(isDeepEqual(null,null)); 和console.log(isDeepEqual(undefined,undefined)); ?
托尼·泰阮

1

要测试变量是否为null或未定义,请使用以下代码。

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

关闭但没有。输掉typeof和比较而undefined不是字符串。这行得通,但是额外的运算符只会使它变得更冗长,而没有其他作用。
临时用户名

在这种情况下,是的,您是对的,我们不需要使用typeof。但是,在处理未定义的变量时,最好使用typeof。使用typeof的原因之一是,如果尚未声明变量,则不会引发错误。
DanKodi

这实际上是一件坏事。您不需要代码中未声明的变量。您希望它引发ReferenceError,以便您可以找到变量并对其进行声明。当然,您不会在像C ++这样的编译语言中尝试这样做!仅仅因为JS允许,并不意味着应该这样做。
临时用户名

1
您的或陈述倒退。第一步是检查未定义的内容,而不是第二步。
安东尼·鲁特里奇

1

我在Chrome控制台中运行此测试。使用(void 0)您可以检查未定义:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

1

让我们看一下

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

    在上面,变量仅声明为apple。在这种情况下,如果调用方法alert,它将显示未定义。

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

在第二个中,它显示为null,因为变量为 apple value的为null。

因此,您可以检查值是未定义的还是null。

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}


0
(null == undefined)  // true

(null === undefined) // false

因为===同时检查类型和值。两者的类型不同,但值相同。


0
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
如果用户输入单词“ undefined”会怎样?
Chuck

您的问题很好,它表明条件为真,因此我们需要将普通未定义的选项更改为typeof条件。@Chuck
KARTHIKEYAN.A

错了 typeof永远不会屈服undefined,只会字符串'undefined'。此外,i == null如果iis 为真,则为true undefined,因此第二个布尔值即使有效也将是多余的。
临时用户名

1
@jkindwall已在2013年10月11日提供了此解决方案(条件相反)。stackoverflow.com/a/19323555/2943403此仅代码发布是完全无用的,因为它没有为页面添加任何新值。实际上,这会使页面膨胀,并使研究人员浪费时间阅读它。请删除此答案。
mickmackusa

0

foo == null检查应该可以解决问题,并以最短的方式解决“ u​​ndefined OR null”情况。(不考虑“没有声明foo”的情况。)但是,过去拥有3个等号(作为最佳实践)的人可能不会接受它。只要看看eqeqeq三等在eslint和tslint规则...

在这种情况下,应使用显式方法(当我们检查变量是否是变量undefinednull单独变量时),而我对该主题的贡献(目前有27个非否定答案!)void 0既用作执行检查的又简短又安全的方法为undefined

使用foo === undefined不安全,因为undefined不是保留字,可能会被屏蔽(MDN)。使用typeof === 'undefined'check是安全的,但是如果我们不关心foo-is-undeclared情况,则可以使用以下方法:

if (foo === void 0 || foo === null) { ... }

0

如果创建一个函数来检查它:

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;
}

-1

调用typeof null返回值“ object”,因为特殊值null被认为是空对象引用。版本5的Safari和版本7的Chrome都有一个怪癖,在正则表达式上调用typeof返回“功能”,而所有其他浏览器返回“对象”。


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

您只能使用第二个:因为它将同时检查定义和声明


-1

我仍然认为测试这两个条件的最佳/安全方法是将值转换为字符串:

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

您能解释一下为什么您认为这是执行测试的“最佳/安全方式”吗?
sadmicrowave '17

因为转换总是返回一个“标准”字符串(即[object Undefined]),所以您不会因为测试伪造的值而遇到麻烦。那只是基于对真实/虚假价值观的经验得出的观点。
n1kkou

感谢您的解释。我没有批评,这是一个有趣的答案,我只是想让您对其他人提供一些解释,说明为什么这可能优于其他方法。
sadmicrowave

别担心!这种类型的比较存在很多问题,直到现在,我发现它是解决此问题的最有用的方法。
n1kkou

-2

您可以使用typeof来检查该值是未定义还是为null:

if(typeof value == 'undefined'){

请参阅上一个答案(stackoverflow.com/a/21273362/6305294)中有关typeof的评论。
Alex

4
这是不正确的。不赶上null。我不明白,为什么对许多年前已经给出正确和完整答案的问题提供了新的,错误的答案。您是否认为当前答案有些不足?
临时用户

-4

if(x==null)在JavaScript中是个坏主意。判断为"=="-可能会导致意外的类型强制,并且CoffeeScript无法读取它, 在条件判断中切勿使用“ ==”或“!=”!

if(x)会更好,但请注意0和“”。它会被当作假的,不是平等法"!= null"真实的

在此处输入图片说明

请参阅JavaScript最佳做法


3
这是完全不正确的,对任何专业级框架或软件的粗略研究将在瞬间证明这一点。使用==要比较的null追赶的标准方式null,并undefined在JS。==在这种特定情况下,强制使用type强制不是风险,实际上已被利用来实现同时捕获nullundefined同时捕获的目标。在选择为几年前令人满意地解决的问题提供错误和误导性的答案之前,请花更多的时间使用该语言。
临时用户

避免使用“ ==”。一切总是在变化,我不同意你@Aerovistae
Albert.Qing

3
您不同意 -您不同意整个JavaScript机构。让我们清楚一点。
临时用户名
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.