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

sad*_*ave 2000 javascript variables null jquery undefined

如何确定变量undefined还是null?我的代码如下:

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

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

Sar*_*raz 2707

您可以使用抽象相等运算符的质量来执行此操作:

if (variable == null){
    // your code here.
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这行不通!!它是如何获得2418票的? (10认同)
  • 我正在尝试测试firefox中的事件是否为null并且错误阻止执行:"event is undefined" (5认同)
  • @MichaelFever那怎么不起作用?将其复制粘贴到您的控制台中:`const y = undefined; y == null;`应该返回true (3认同)
  • 可能很棘手:`undefined !== null` --&gt; *true* `undefined == null` --&gt; true (3认同)
  • @ZaytsevDmitry,如果变量等于“0”,为什么您期望变量为“null”或“undefined”的测试能够通过?问题不在于测试真值,而在于显式测试“null”或“undefined”。 (3认同)
  • @ChrisStryczynski在示例中,您的注释中声明了y常量,但是您比较了abc(而不是y)。当我在Chrome和Firefox上通过console.log(y == null);测试y时,得到的结果为true。如果遇到错误,则可能尝试使用赋值运算符“ =”而不是比较“ ==`”,这将导致返回错误,因为无法重新分配`const`。 (2认同)
  • 我从不建议使用这种比较,即使它涵盖了两个值。继续使用 (var === null || var === undefined) 代替。 (2认同)
  • 如果变量等于0将不起作用 (2认同)
  • [比较示例](https://repl.it/@RyanHaining1/nullequalsundefined)。lgtm。 (2认同)
  • @Sarfraz 的上述代码抛出 **“Uncaught ReferenceError:变量未定义”** !!! 这样的答案怎么能被如此广泛地接受呢?我是这里唯一一个对这种最简单的代码不起作用的人吗? (2认同)

tem*_*ame 1064

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

if (variable == null) {
     // do something 
}
Run Code Online (Sandbox Code Playgroud)

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

if (variable === undefined || variable === null) {
     // do something 
}
Run Code Online (Sandbox Code Playgroud)

在编写专业JS时,理所当然地认为类型相等和==vs 的行为===是理解的.因此我们使用==并且仅与之比较null.


再次编辑

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

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

  • 这更像是一个风格点。如果变量没有在 *all* 声明,那真的只是作者写的不好。您应该知道您的变量是否已声明,这不应该是一个问题。但是*是*,如果出于*某种原因*是这种情况,应该将其更改为*window.variable* 而不仅仅是*variable*,这不会导致引用错误。应避免使用 typeof。 (52认同)
  • 如果在代码中根本没有定义或引用变量,这将导致 ReferenceError 并中断执行,使用 typeof 更安全。 (45认同)
  • 如果可选地未提供@TimothyKanski可选参数,则它们可能是未定义的,但它们绝对是声明的变量.它们被声明并具有值"undefined",因为任何声明但未初始化的变量都是,即`var someVar;`所以你的论证并没有真正支撑 (13认同)
  • -OP:关于那些比较为"100%等效"的声明是简单的错误,正如您在自己的编辑中所指出的,第二个将导致ReferenceError.至于断言:"你不应该在你的代码中引用未声明的变量." 真?听说过可选参数吗?https://jsfiddle.net/3xnbxfsu/ (8认同)
  • 是的,因为你写了`!==`而不是`!=`. (6认同)
  • @Thomas`if(变量)`测试真实性.它会计算出`false`,`0`,`NaN`和一个空字符串以及`null`和`undefined`,因此这里不是正确的答案.至于`instanceof`,如果问题是"这个变量是空的还是未定义的?" (也许你*希望*值为`null`或`undefined` ...)你无法确定`instanceof`,除非通过检查值*不是*任何其他类型的实例,这是疯.所以这也是错误的答案. (5认同)
  • 你不需要`typeof`来检查`data ['token']` - 这可以通过`if(data.token!= null){/*use data.token*/}`来完成.它并没有什么不同.但是,你对Angular是正确的.他们有一些非常专业的方法,比如`isBlankObject`和`hasCustomToString`.显然,他们想要涵盖变量为"undefined"/"null"的情况以及未声明的引用.虽然你对他们的代码是正确的,但对于大多数人来说这不是他们想要的东西,我坚持认为,如果你认为你需要它,你可能会弄错. (4认同)
  • @chiliNUT我放弃了与仍在发表评论的人争论.一年左右,我要求一个mod来清理评论.有这么多人试图说服我这是错的.它永远不会结束. (4认同)
  • 你忘了很多用例.你从其他地方获得的数据如url查询参数或来自某些API的json数据怎么样?动态结构怎么样?您应该能够测试是否定义了`data ['token']`?顺便说一下,你提到了Angular Framework,但是为​​什么Angular会定义一些`angular.isDefined`函数,如果它没用的话?你的答案有点超级严谨,缺乏实用主义. (3认同)
  • 也就是说,对于像javascript和php这样的低入门成本的语言而言,它是一个常见的东西,你需要在你真正编程之前对语言的工作方式有更复杂的理解,例如Haskell或斯卡拉 (3认同)
  • 并确定不需要`typeof`。答案[这里](http://stackoverflow.com/questions/43275854/is-there-any-way-to-distinguish-between-an-unset-property-and-a-property-set-to/43275887# 43275911) 可以区分 `undefined` 和“根本没有收到”,这对于 `typeof` 肯定是不可能的。为了区分你列出的其他 8 个项目,只有 `===` 可以完成工作。我什至无法想象你是如何得出这样的结论的,即 `typeof` 会区分 0 和 1 或真假,而 `====` 不会。 (2认同)
  • 在变量既不是"null"也不是"undefined"的所有情况下,该条件将被评估为true,所以如果这是你想要的那么是,它将给出所需的结果.你可以很容易地测试它btw :) (2认同)
  • 然后我可以推断您完全复制并粘贴了我的代码。对我来说,这意味着您没有意识到“变量”应该替换为变量的名称。我认为阅读 JavaScript 基础教程可能对您来说是最好的选择。 (2认同)
  • @temporary_user_name 我觉得你的声明“你不应该在代码中引用任何未声明的变量”象征着毒性和 SO 的问题,它忽略了现实生活中的各种用例。`if ( typeof module != '未定义' &amp;&amp; module.exports ) { module.exports = myModule; } else if ( typeof Define == 'function' &amp;&amp; Define.amd ) { Define( function () { return myModule; } ); } else { window.myModule= myModule; }` 如果我正在构建一个库并希望支持各种浏览器,我应该放弃,因为你认为这很糟糕? (2认同)
  • SO 是为具有不同技能水平和用例的各种用户提供参考。如果每个人都应该使用函数式编程而不是 OOP 或其他什么,那么这不是你用来断言哪种实践是好的的肥皂剧。面无表情地说“X 不应该做”对这个社区是有害的。如果你的措辞是“一般来说,这会被认为是不好的做法”,我就不会有任何问题了。 (2认同)

小智 216

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

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这是一个更好的解决方案,因为@Rogue指出,可能不会声明变量. (3认同)
  • @Aerovistae我认识到`typeof`是一个操作符,而不是一个函数,所以它不需要括号,但我仍然欣赏括号 - 只是为了清晰起见. (2认同)
  • @ArjunU如果未声明变量,将导致ReferenceError.如果您不知道是否声明了变量,请使用上述解决方案.如果可以保证变量至少被声明,则可以使用`variable == null` (2认同)

小智 184

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

  • 它仅适用于声明的变量,而不适用于可能声明或未声明的变量,这种情况很少发生.(对于那种情况,你需要使用typeof + null检查) (48认同)
  • 万一有人认为这是另一个半答案,这实际上确实有效.`undefined`的计算结果等于`null`. (14认同)
  • 只需[想出](http://www.jshint.com/docs/#options)你可以添加这个注释:`/*jshint eqnull:true*/`到JS文档或函数的顶部,JSHint将停止警告你使用`== null`. (11认同)
  • 在chrome控制台中我失败了...... ReferenceError:变量没有定义,所以它可能有用,但不适合我...... (3认同)
  • @Aerovistae 您能否指出一个明确指出 `==` 已损坏的引用。这个答案中的强制性`if(variable == null)` 对我来说完全有意义...... (3认同)
  • 出于某种原因,JSHint不喜欢这个.:( (2认同)
  • 代码对您有意义的事实并不使它成为合理的代码。 (2认同)

Tha*_*vam 89

if (typeof EmpName != 'undefined' && EmpName) {
Run Code Online (Sandbox Code Playgroud)

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

  • 空值

  • 未定义

  • 为NaN

  • 空字符串("")

  • 0

  • 我认为这是一种危险的技术,像野火一样蔓延.因为检查的很多变量可能是布尔值或数字.因此,如果用户没有完全理解后果,那就不好了. (12认同)
  • 这与“if (EmpName)”相同。如果它是“未定义”,那么它就已经是假的了。 (2认同)
  • 如果未定义变量。那么 if(EmpName) 会抛出错误 (2认同)

Kam*_*ski 35

可能做到这一点的最短方法是:

if(EmpName == null) { /* DO SOMETHING */ };
Run Code Online (Sandbox Code Playgroud)

这是证明:

if(EmpName == null) { /* DO SOMETHING */ };
Run Code Online (Sandbox Code Playgroud)

这里有更多关于==(来源在这里)的详细信息

在此处输入图片说明

奖励:原因=====(查看agc 答案)更清楚

在此处输入图片说明


Che*_*try 24

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

所以你可能想要测试一个空字符串.或者,由于空字符串null和undefined都是false-y,所以你可以这样做:

if (!EmpName) { //do something }
Run Code Online (Sandbox Code Playgroud)

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

phi*_*294 16

我来为此写自己的功能.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;
}
Run Code Online (Sandbox Code Playgroud)

打字稿兼容.


编辑.这个功能应该做的正是同样的事情,像PHP的empty()功能(见图RETURN VALUES)

认为undefined,null,false,0,0.0,"0" {},[]为空.

"0.0",NaN," ",true被视为非空.

  • 您应该在这里将“ ==”的“全部”更改为“ ===”,这将是一个合理的功能。 (3认同)
  • 我遇到了一些null检查问题。我想检查传递的参数是否为空,或者是否为空对象“ {}”。这是一个常见且愚蠢的语言问题,但我已经忘记了。我所有的搜索都显示未定义的空值或宽松的相等比较(==)的答案,但没有严格的相等(===)或等效的答案。然后,您在页面**非常底部**中的-1排名答案(在我投票之前)是我无法回答的答案。假设Object.keys(obj).length &lt;1或=== 0(假设它永远不会为-1)。无论如何,提高到0,求爱。:p (2认同)

Dev*_*ius 13

JavaScript 中,据我所知,我们可以检查undefinednull变量,如下所示。

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}
Run Code Online (Sandbox Code Playgroud)

检查所有条件:

if(variable === undefined || variable === null || variable === ''){
}
Run Code Online (Sandbox Code Playgroud)


Den*_*isS 11

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

if (window.yourVarName) {
    // Your code here
}
Run Code Online (Sandbox Code Playgroud)

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

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

if (window.history) {
    history.back();
}
Run Code Online (Sandbox Code Playgroud)

这是如何工作的:

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

  • 读者应该注意,像这样的方法是用于检查 - 从浏览器中运行的 JavaScript - 是否已声明 *global* 变量,尤其是浏览器提供的全局变量(如历史 API)是否可用的惯用方法。它*不会*用于检查非全局变量是`null`还是`undefined`,如果您的JavaScript在浏览器之外运行(即在Node.js中),它也不会起作用。它还会将设置为“0”、“false”或“”的全局变量与未声明或“未定义”或“空”的全局变量相同,这通常没问题。 (3认同)

Wel*_*boy 8

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

if (object) {
    // Your code
}
Run Code Online (Sandbox Code Playgroud)

例如:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}
Run Code Online (Sandbox Code Playgroud)

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

agc*_*agc 8

您可以简单地使用以下内容(我知道有更短的方法可以做到这一点,但这可能会使视觉观察更容易,至少对于查看代码的其他人而言)。

if (x === null || x === undefined) {
 // Add your response code here, etc.
}
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.growthsnippets.com/how-can-i-determine-if-a-variable-is-undefined-or-null/


小智 8

最短和最容易的:

if(!EmpName ){
 // DO SOMETHING
}
Run Code Online (Sandbox Code Playgroud)

如果EmpName为:

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

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

Ang*_*dar 7

由于您使用的是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;
Run Code Online (Sandbox Code Playgroud)


Ash*_*ana 7

通过最新的 javascript 更改,您可以使用新的逻辑运算符??=来检查左操作数是否为nullor undefined,如果是则分配右操作数的值。

所以,

if(EmpName == null){  // if Variable EmpName null or undefined
  EmpName = 'some value';
};
Run Code Online (Sandbox Code Playgroud)

相当于:

EmpName ??= 'some value';
Run Code Online (Sandbox Code Playgroud)


Kap*_*pil 6

jQuery 检查元素不为空:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}
Run Code Online (Sandbox Code Playgroud)


小智 5

最简单的检查方法是:

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

  • 抱歉,但这是不正确的。这是一个[JSfiddle](https://jsfiddle.net/w5ynkav3/)来证明这一点。 (2认同)