JavaScript如何检查一个值是否仅为undefined、null或false

53

除了创建一个函数,JavaScript中是否有一种更短的方法来检查值是否仅为undefinednullfalse

下面的if语句相当于if(val===null && val===undefined val===false)这段代码可以正常工作,我正在寻找一种更简洁的等效方法。

if(val==null || val===false){
  ;
}

val==null 满足条件当且仅当 val=undefined 或者 val=null

我在考虑使用位运算符或其他巧妙的方法。


2
'',0,'0'以及其他几种配置都是真的。 - Lime
1
“===”运算符在这里很好用,为什么你在与“null”比较时使用“==”呢? - r3c
1
我认为这是最短的代码...或者您可以创建自己的函数。顺便说一下,'0'不等同于false - Felix Kling
这有点混乱。如果你像我一样来到这里,请去阅读这篇文章:http://www.mapbender.org/JavaScript_pitfalls:_null,_false,_undefined,_NaN - Nathan Cooper
if (!value) 有什么问题吗? - Timo Ernst
显示剩余11条评论
9个回答

41

好吧,你总可以“放弃” :)

function b(val){
    return (val==null || val===false);
}

3
我差不多放弃了,但最终还是把“false”改成了“!1”。 - Lime
1
我认为我们可以将 val === false 改为 val == false :) - Konza
@Konza: 这就是==的定义方式。这相当复杂,这也是为什么许多人建议在不确定的情况下使用===,除非你真的知道自己在做什么。 - hugomg
这很疯狂,但对我来说它不适用于 null,而是适用于 'null'!!并且也不适用于 val == ''(在 Firefox 控制台和实时测试过....如果你有线索? - TOPKAT
盗版地 - 副词。以海盗的方式做某事... - JJS
显示剩余2条评论

19

我认为您在寻找的是!!val==false,可以转换为更短的形式!val,但含义不变:

您可以看到:

function checkValue(value) {
    console.log(!!value);
}

checkValue(); // false
checkValue(null); // false
checkValue(undefined); // false
checkValue(false); // false
checkValue(""); // false

checkValue(true); // true
checkValue({}); // true
checkValue("any string"); // true

这可以通过使用 ! 运算符来翻转值来实现。

例如,如果您想要翻转 null ,可以这样做:

console.log(!null) // that would output --> true

如果你像这样翻转两次:

console.log(!!null) // that would output --> false

undefinedfalse 一样。

你的代码:

if(val==null || val===false){
  ;
}

那么就会变成:

if(!val) {
  ;
}

即使存在一个字符串但其长度为零,这种方法也适用于所有情况。 现在,如果您希望它也适用于数字0(如果对其进行双重取反,则变为false),则您的if语句将变为:


if (!variable || (typeof variable === "number" && variable === 0)) { // code to be executed if variable is undefined, null, "", [], or 0 }
if(!val && val !== 0) {
  // code runs only when val == null, undefined, false, or empty string ""
}

你忘记了0和''。 - Lime
更新了答案,同时考虑了字符串和数字零0。 - SudoPlz

18

我认为最好的方法是:

if(val != true){
//do something
} 

如果 val 为 false、NaN 或 undefined,则此条件为真。


1
这种技术可能是最好的,不考虑 NaN 值。 - Lime

3

2
有一种方法可以这样做:

如下所示:

var acceptable = {"undefined": 1, "boolean": 1, "object": 1};

if(!val && acceptable[typeof val]){
  // ...
}

我认为它可以在满足你的限制条件下最小化操作数量,从而使检查速度更快。


1

Boolean(val)=== false。这对我来说有效,可以检查值是否为假。


但是对于 0"" 也同样适用。此外,Yiding 已经提供了这个解决方案。 - Felix Kling

1

我所知道的类似于这样的快捷方式只有

var val;
(val==null || val===false) ? false: true;

@missingno看不出为什么不行...它比写出if ... else ...更短,而且无论如何,你怎么能让这样的条件语句变得更短呢?...在我看来,这是比“放弃”更好的答案 >.> - Joseph Marikle
你的条件语句只是将事物转换为布尔值。然而,这可以使用 !! 更加简洁地完成,或者在这种情况下,什么都不用做,因为条件已经是布尔值了。 - hugomg
@missingno 不不不不...根据条件执行的任何代码都将放置在falsetrue的位置...这只是为了清楚地表明什么结果导致什么。 - Joseph Marikle
有些人认为这是不好的编程风格。三元运算符应该用于返回值,而不是用于其副作用。 - Felix Kling
我会在那些falsetrue的地方添加函数。现在它看起来过于复杂了。 - Lime

0

使用 ? 更加简洁。

var ? function_if_exists() : function_if_doesnt_exist();

-1

尝试像下面这样

var Boolify = require('node-boolify').Boolify;
if (!Boolify(val)) {
    //your instruction
}

请参考node-boolify


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