ChatGPT解决这个技术问题 Extra ChatGPT

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

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

使用内置的 Nullish 合并运算符 (??) Ref; developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
@DennisNolan 这个问题是在 2010 年提出的
if(EmpName == 'undefined') 不会测试 EmpName 是否未定义,它会测试字符串“undefined”,所以去掉那些单引号: if(EmpName == undefined) // 因为 'undefined' 没有引号is... undefined 或更简单的 if(!EmpName){ // DO SOMETHING };

u
user229044

您可以使用 abstract equality operator 的特性来执行此操作:

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

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


我正在尝试测试 Firefox 中的事件是否为空,并且错误会阻止执行:“事件未定义”
@MichaelFever 那怎么行不通?将此复制粘贴到您的控制台中:const y = undefined; y == null; 它应该返回 true
@ChrisStryczynski 在您的评论示例中,您声明 y 为常量,但您需要比较 abc(不是 y)。当我在 Chrome 和 Firefox 上通过 console.log(y == null); 测试 y 时,我得到了 true。如果您遇到错误,那么您可能尝试使用赋值运算符 = 而不是比较 ==,这将返回错误,因为无法重新分配 const
可能很棘手:undefined !== null --> undefined == null -->真的
live example 的相关比较。 lgtm
t
temporary_user_name

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

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

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

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

在写专业的 JS 时,理所当然地理解 type equality and the behavior of == vs ===。因此我们使用 == 并且只与 null 进行比较。

再次编辑

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

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


如果在代码中根本没有定义或引用变量,这将导致 ReferenceError 并中断执行,使用 typeof 更安全。
这更像是一个风格点。如果变量根本没有被声明,那真的只是作者写得不好。您应该知道您的变量是否已被声明,这不应该是一个问题。但是是的,如果由于某种原因是这种情况,则应将其更改为 window.variable 而不仅仅是变量,这不会导致引用错误。应避免使用 typeof。
是的,因为您写的是 !== 而不是 !=
-OP:关于这些比较是“100% 等效”的声明是完全错误的,正如您在自己的编辑中指出的那样,第二个将导致 ReferenceError。至于断言:“您的代码中不应引用任何未声明的变量。”真的吗?听说过可选参数吗? jsfiddle.net/3xnbxfsu
@TimothyKanski 可选参数如果未提供可选参数,则可能未定义,但它们绝对是声明的变量。它们被声明并具有 undefined 的值,就像任何已声明但未初始化的变量一样,即 var someVar;,因此您的论点并没有真正成立
v
vsync

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

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

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


@Aerovistae 我认识到 typeof 是一个运算符,而不是一个函数,所以它不需要括号,但我仍然很欣赏括号 - 只是为了阅读清晰。
直接检查 if(variable===undefined) 而不是使用 typeof 怎么样?
@ArjunU 如果未声明变量,将导致 ReferenceError 。如果您不知道是否声明了变量,请使用上述解决方案。如果您可以保证至少声明了变量,则可以使用 variable == null
这是一个更好的解决方案,因为正如@Rogue 指出的那样,变量可能不会被声明。
如果我错了,请纠正我,但第一个条件不是第二个的超集,因此第二个条件是多余的吗?
k
knocte
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

万一有人认为这是另一个半答案,这确实有效。 undefined 等于 null
在 chrome 控制台中对我失败... ReferenceError:变量未定义,因此它可能有效,但不适合我...
它仅适用于已声明的变量,而不适用于可能声明或未声明的变量,这种情况很少见。 (对于这种情况,您需要使用 typeof + null 检查)
只需 figured out,您就可以在 JS 文档或函数的顶部添加以下注释:/*jshint eqnull:true */,JSHint 将停止警告您使用 == null
@Aerovistae 您能否指出一个明确指出 == 已损坏的参考资料。这个答案中的强制 if(variable == null) 对我来说完全有意义......
T
Thamaraiselvam
if (typeof EmpName != 'undefined' && EmpName) {

如果 value 不是,将评估为 true:

无效的

不明确的

空字符串 ("")

0

错误的


我认为这是一种危险的技术,已经像野火一样蔓延开来。因为许多检查的变量可能是布尔值或数字。所以如果用户不完全理解后果,这是没有好处的。
请提供此 javascript especification 的参考
这与 if (EmpName) 相同。如果它是 undefined 就已经是假的了。
如果变量未定义。那么 if(EmpName) 会抛出错误
@Thamaraiselvam 我认为鲁迪可能是这个意思var EmpName; if (EmpName)。变量已定义但未分配值的位置。
K
Kamil Kiełczewski

可能最短的方法是:

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

这是证据:

函数检查(EmpName){如果(EmpName == null){返回真; };返回假; } var log = (t,a) => console.log(`${t} -> ${check(a)}`);日志('空',空);日志('未定义',未定义);日志('NaN',NaN);日志('””', ””);日志('{}', {});日志('[]', []);日志('[1]', [1]);日志('[0]', [0]);日志('[[]]', [[]]);日志('真',真);日志('假',假);日志('“真”',“真”);日志('"假"', "假");日志('无穷大',无穷大); log('-无穷大', -无穷大);日志('1',1);日志('0',0);日志('-1',-1);日志('"1"', "1");日志('"0"', "0");日志('"-1"', "-1"); // "void 0" case console.log('---\n"true" is:', true); console.log('"void 0" is:', void 0);日志(无效 0,无效 0); // “void 0”是“未定义”

以下是有关 == 的更多详细信息(来源 here

https://i.stack.imgur.com/nkpj6.png

奖励===== 更清晰的原因(查看 agc answer

https://i.stack.imgur.com/7MeG6.png


谢谢你,很好的答案!像 if(var) 或 if(!var) 这样的表达式呢?
@IceFire 示例差异:if(var)/if(!var) 将为值 true/false 执行代码。 var 的那些值的 if(var == null) 永远不会执行代码...
好吧,这很简单,但是上面的矩阵之一也可以用来检查 if 表达式为不同的值产生什么吗?
@IceFire 在我的回答中有指向此图片来源的链接-那里还有 if 语句“矩阵”
C
Chetan S

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

因此,您可能希望针对空白字符串进行测试。或者,由于空白字符串、null 和 undefined 是 false-y,您可以这样做:

if (!EmpName) { //do something }

Chrome 17.0.963.78 m 给出了这个错误:ReferenceError: EmpName is not defined
@EranMedan 我知道这已经很晚了,但希望它会帮助以后来这里的人。您收到错误的原因是因为它根本没有被声明。通常你会将 EmpName(或其他一些变量)传递给一个函数,或者另一个函数的返回值并因此声明(例如:“var x;”)。要测试它是否返回 undefined、null 或空白字符串,您可以使用上述解决方案。
我意识到这是一个很冷的问题,但是如果元素上不存在该属性,jQuery 将返回 undefined (不仅仅是如果选择器没有匹配的元素,根据答案)。例如,没有 srcimg 将为 $('img').attr('src'); 返回 undefined
t
turivishal

编辑的答案:在我看来,你不应该使用我下面的旧答案中的功能。相反,您可能应该知道变量的类型并直接使用根据检查(例如,想知道数组是否为空?只需执行 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() function 相同的事情(参见 RETURN VALUES

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

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


我遇到了一个小空值检查问题。我想检查传递的参数是否为空或空对象 { }。这是一个常见且愚蠢的语言问题,但我忘记了。我所有的搜索都显示了未定义空值或松散相等比较 ( == ) 的答案,但不显示严格相等 ( === ) 或等效的答案。然后在页面最底部的 -1 排名答案中(在我投票之前)是我无法理解的答案。 Object.keys( obj ).length < 1 或者可能 === 0,假设它永远不会是 -1。无论如何,投票给0,哇。 :p
谢谢,我已经能够删除这个函数并清理很多代码。为什么这不是标准的 JS 函数超出了我的理解。
您应该在此处将您的 ==all 更改为 ===,那么这将是一个合理的功能。
A
Artog

最短和最简单的:

if(!EmpName ){
 // DO SOMETHING
}

如果 EmpName 是,这将评估 true:

无效的

不明确的

空的

细绳 (””)

0

错误的


这里的用例是我想知道 undefined 和 false 之间的区别。然后我将使用对 null 的检查。
M
Mark Amery

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

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

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

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

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

这是如何工作的:

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


读者应该注意,这样的方法用于检查 - 从浏览器中运行的 JavaScript - 是否已声明 global 变量,尤其是浏览器提供的全局(如历史 API)是否已声明可用的。它将不起作用来检查非全局变量是 null 还是 undefined,如果您的 JavaScript 在浏览器之外运行(即在 Node.js 中),它也不起作用。它还会将设置为 0false'' 的全局变量与未声明或 undefinednull 的全局变量相同,这通常很好。
这假定脚本在浏览器中运行。这不是给定的。
H
Hardik Desai

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

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

检查所有条件:

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

var 是保留字,这将抛出 SyntaxError
@dhilt 从 var 到 variable 实现
W
Warren Sergent

由于您使用的是 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 is not defined 第一个示例。
R
Richie Bendall

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

if (object) {
    // Your code
}

例如:

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

最好设置 var A = document.getElementById("enterJob") if(A)A.className+= 'current';这样你就可以完成 50% 的工作以获得相同的结果……但也许你只是为了表演而这样做,然后我向你致敬。
a
agc

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

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

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


P
Peter Mortensen

jQuery 检查元素不为空:

var dvElement = $('#dvElement');

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

C
Cody Gray

最简单的检查方法是:

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

如果变量的值为 false,这将执行代码,这可能是不可取的。
问题很明确“如何确定变量是'未定义'还是'null'?”在 javascript 中,如果变量的值为 null 或 undefined,则其值为 false。
对不起,但这是不正确的。这里有一个 JSfiddle 来证明它。
根据您的回答,undefinednull 其他一些内容(例如空字符串、+0、-0 NaNfalse)可以通过。 ! 运算符将操作数(此处为 variable)强制为布尔值:ecma-international.org/ecma-262/#sec-toboolean
但是请检查问题:“如何确定变量是未定义还是为空”,!如果变量为 null 或未定义,则与 if 一起使用的操作数将始终返回 true。
A
Ashan Priyadarshana

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

所以,

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

相当于:

EmpName ??= 'some value';

P
Peter Mortensen

我在 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

T
Tony Tai Nguyen

使用以下解决方案:

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

我可以检查以下内容:

无效的

不明确的

空的

细绳 (””)

0

错误的


这并没有回答问题,即“我如何捕获 null 和 undefined?”而不是“我如何捕捉 JavaScript 中的每一个虚假值?”
@Aerovistae,我以为我使用了 console.log(isDeepEqual(null, null));和 console.log(isDeepEqual(undefined, undefined)); ?
D
DanKodi

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

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

关闭但没有。丢失 typeof 并直接与 undefined 进行比较,而不是作为字符串。这可行,但额外的运算符没有任何作用,只是让它变得更冗长。
在这种情况下,是的,你是对的,我们不需要使用 typeof。但是在处理未定义的变量时,使用 typeof 是一个很好的做法。使用 typeof 的一个原因是,如果尚未声明变量,它不会引发错误。
这实际上是一件坏事。您不希望代码中有未声明的变量。您希望它抛出一个 ReferenceError 以便您可以找到变量并声明它。当然,您不会在 C++ 之类的编译语言中尝试这样做!仅仅因为 JS 允许它并不意味着它应该被完成。
你的 or 陈述是倒退的。检查某些东西是否未定义将是第一步,而不是第二步。
E
Ernesto

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

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

F
Franklin Pious
(null == undefined)  // true

(null === undefined) // false

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


P
Peter Mortensen

让我们看看这个,

让苹果; // 只将变量声明为apple alert(apple); // undefined 在上面,变量只被声明为apple。在这种情况下,如果我们调用方法 alert 它将显示 undefined。让苹果=空; /* 将变量声明为 apple 并初始化,但值为 null */ alert(apple); // 无效的

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

所以你可以检查一个值是未定义的还是空的。

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

d
dhilt

foo == null 检查应该可以解决问题并以最短的方式解决“未定义或空”的情况。 (不考虑“未声明 foo”的情况。)但是习惯了 3 个等于(作为最佳实践)的人可能不会接受它。看看 eslint 和 tslint 中的 eqeqeqtriple-equals 规则...

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

使用 foo === undefined 是不安全的,因为 undefined 不是保留字并且可以被隐藏 (MDN)。使用 typeof === 'undefined' 检查是安全的,但如果我们不关心 foo-is-undeclared 的情况,可以使用以下方法:

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

B
Bhavya Koshiya

你可以做这样的事情,我认为在一个条件下对同一个变量进行多值检查更有效

const x = undefined;
const y = null;
const z = 'test';

if ([undefined, null].includes(x)) {
  // Will return true
}

if ([undefined, null].includes(y)) {
  // Will return true
}

if ([undefined, null].includes(z)) {
  // Will return false
}

J
Jones Agyemang

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


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

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


P
Peter Mortensen
var i;

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

如果用户输入单词 'undefined' 会发生什么?
您的问题很好,它表明条件为真,因此我们需要将选项 normal undefined 更改为 typeof 条件。 @查克
这是错误的。 typeof 永远不会产生 undefined,只会产生字符串 'undefined'。此外,如果 iundefined,则 i == null 已经为真,因此即使它有效,第二个布尔值也是多余的。
此解决方案(条件相反)已由 @jkindwall 于 2013 年 10 月 11 日提供。stackoverflow.com/a/19323555/2943403 此纯代码帖子完全没用,因为它没有为页面添加新值。事实上,它正在增加页面膨胀并浪费研究人员阅读它的时间。请删除此答案。
P
Peter Mortensen

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

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
}

您能解释一下为什么您认为这是执行测试的“最佳/安全方式”吗?
因为转换总是返回一个“标准化”字符串(即[object Undefined]),所以你不会因为测试虚假值而陷入困境。这只是我根据真实/虚假价值观的经验得出的观点。
感谢您的解释。我不是在批评,这是一个有趣的答案,我只是想让你为其他人提供一些解释,说明为什么这可能优于其他方法。
不用担心!我对这种类型的比较有很多问题,直到现在,我发现它是解决这个问题的最有用的方法。
n
noseratio

似乎没有人需要发布这个,所以我们开始吧:

a?.valueOf() === undefined 可靠地为 nullundefined 工作。

以下内容与 a == nulla == undefined 非常相似,但对于不喜欢 == 的纯粹主义者来说可能更有吸引力😎

函数 check(a) { 常量值 = a?.valueOf(); if (value === undefined) { console.log("a is null or undefined"); } else { console.log(value); } } 检查(空);检查(未定义);检查(0);查看(””);查看({});查看([]);

附带说明一下,a?.constructor 也可以:

function check(a) { if (a?.constructor === undefined) { console.log("a is null or undefined"); } } 检查(空);检查(未定义);检查(0);查看(””);查看({});查看([]);