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

文章讨论了多种在JavaScript中检查变量是否为undefined或null的方法,包括使用==null、typeof、if(!variable)等条件语句。还提到了不同方法的适用场景和潜在陷阱,如未声明变量会导致ReferenceError。此外,答案中还涉及了其他值如空字符串、0和false的判断,并提供了一些实用的代码示例。
摘要由CSDN通过智能技术生成

问:

如何确定变量是 undefined 还是 null?

我的代码如下:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};


  


但如果我这样做,JavaScript 解释器会停止执行。

答1:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

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

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

我正在尝试测试 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

答2:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

同时捕获 null 和 undefined 的标准方法是:

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;,因此您的论点并没有真正成立

答3:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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

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

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

@Aerovistae 我认识到 typeof 是一个运算符,而不是一个函数,所以它不需要括号,但我仍然很欣赏括号 - 只是为了阅读清晰。

直接检查 if(variable===undefined) 而不是使用 typeof 怎么样?

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

这是一个更好的解决方案,因为正如@Rogue 指出的那样,变量可能不会被声明。

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

答4:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

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) 对我来说完全有意义......

答5:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

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

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

无效的

不明确的

空字符串 (“”)

0

错误的

我认为这是一种危险的技术,已经像野火一样蔓延开来。因为许多检查的变量可能是布尔值或数字。所以如果用户不完全理解后果,这是没有好处的。

请提供此 javascript especification 的参考

这与 if (EmpName) 相同。如果它是 undefined 就已经是假的了。

如果变量未定义。那么 if(EmpName) 会抛出错误

@Thamaraiselvam 我认为鲁迪可能是这个意思var EmpName; if (EmpName)。变量已定义但未分配值的位置。

答6:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

可能最短的方法是:

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 语句“矩阵”

答7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

jQuery attr() 函数返回一个空白字符串或实际值(从不返回 null 或 undefined)。它返回 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 (不仅仅是如果选择器没有匹配的元素,根据答案)。例如,没有 src 的 img 将为 $('img').attr('src'); 返回 undefined

答8:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

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

将 undefined、null、false、0、0.0、“0” {}、[] 视为空。

“0.0”、NaN、" "、true 被视为非空。

我遇到了一个小空值检查问题。我想检查传递的参数是否为空或空对象 { }。这是一个常见且愚蠢的语言问题,但我忘记了。我所有的搜索都显示了未定义空值或松散相等比较 ( == ) 的答案,但不显示严格相等 ( === ) 或等效的答案。然后在页面最底部的 -1 排名答案中(在我投票之前)是我无法理解的答案。 Object.keys( obj ).length < 1 或者可能 === 0,假设它永远不会是 -1。无论如何,投票给0,哇。 :p

谢谢,我已经能够删除这个函数并清理很多代码。为什么这不是标准的 JS 函数超出了我的理解。

您应该在此处将您的 == 的 all 更改为 ===,那么这将是一个合理的功能。

答9:

huntsbot.com – 高效赚钱,自由工作

最短和最简单的:

if(!EmpName ){
 // DO SOMETHING
}

如果 EmpName 是,这将评估 true:

无效的

不明确的

空的

细绳 (””)

0

错误的

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

答10:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

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

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

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

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

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

这是如何工作的:

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

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

这假定脚本在浏览器中运行。这不是给定的。

答11:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

检查所有条件:

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

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

var 是保留字,这将抛出 SyntaxError

@dhilt 从 var 到 variable 实现

原文链接:https://www.huntsbot.com/qa/eR8W/how-can-i-determine-if-a-variable-is-undefined-or-null?lang=zh_CN&from=csdn

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值