JavaScript检查非空值

177

以下是一个代码片段,我们从中获取表单值。在进一步处理之前,请检查该值是否不为 null。

var val = document.FileList.hiddenInfo.value;
alert("val is " + val);  // this prints null which is as expected
if (val != null)
{
   alert("value is "+val.length); // this returns 4
}
else
{
   alert("value* is null");
}
任何想法为什么会这样发生.. ??

3
CW(社区维基)的发生是因为6个或更多用户编辑了该问题。 - YOU
!==代替!= - GetBackerZ
@YOU 什么是CW? - snoob dogg
@snoobdogg 社区维基?! - simanacci
11个回答

168

这将为您解决问题。

if (!!val) {
    alert("this is not null")
} else {
    alert("this is null")
}

31
技术上讲这是可行的,但双重否定(!!)是编程中不良实践。事实上,它与 if(val) 是等价的,后者更易于阅读。我建议坚持使用 if(val) (顺带一提,Ujwal,!!val 在 C 或 C++ 中也是可行的)。有关 JavaScript“真值”(truthiness)的更多信息,请参见此处:https://janosch.woschitz.org/javascript-equality-comparison/。 - Will Buck
4
如果(!Boolean(val))怎么样? - thedjaney
1
!!只是双重否定,实际上它的意思就是说如果(val.exists)。虽然如此,我仍然喜欢它的外观! - Clay Banks
24
如果val = 0,那么这将失败,因为!!0的结果是false。 - punkrockpolly
6
这不是简单的双重否定,而是一种转换性的双重否定。基本上,你正在将变量转换为布尔值。关于这个主题有很多话要说,但是可以简单地说,在变量为 0falsenullundefined 或类似值的情况下,一个 ! 可以得到一个 true 值,然而两个 !! 将会得到 false 值。如果使用,应该尽量避免。 - Guy Passy
显示剩余4条评论

139
有三种方法可以检查“非空”。我的建议是使用严格的非空版本。

1. 严格的非空版本

if (val !== null) { ... }

严格不相等版本使用严格相等比较算法!== 运算符比 != 运算符具有更快的性能,因为严格相等比较算法不会进行类型转换。

2. 非严格不相等版本

if (val != null) { ... }

非严格不相等版本使用抽象相等比较算法。`!=`运算符的性能比`!==`运算符慢,因为抽象相等比较算法会进行类型转换。

3. 双非版本

if (!!val) { ... }
双非版本严格非版本非严格非版本都有更快的性能。然而,!!运算符会将0''undefinedNaN等"假值"类型转换为false,这可能导致意外结果,并且可读性较差,因为null没有明确说明。

非常奇怪。 !!val 对我有用,但是 val!==null却没有。为什么呢? - TheLogicGuy
@TheLogicGuy - val 的数据类型是什么?console.log(typeof val) - tim-montague
数字。该代码从数组中删除“不良”值(null、0等)。以下是代码:http://pastebin.com/L7Z1BtuL - TheLogicGuy
1
@TheLogicGuy - 你实际的问题与null无关。 NaN没有正确过滤 - 这将始终返回true。这应该可以解决:!(isNaN(val) && (typeof val !== "undefined"))。在Javascript中有一个称为“Truthy”和“Falsey”的概念。双非运算符!!将删除更多内容,而不仅仅是null。它还会将NaNundefined转换为false。这就是为什么使用双非运算符!!时,您的数组可以正确过滤的原因。 - tim-montague

86

这是因为val不是null,而是包含一个字符串'null'

尝试使用'null'进行检查。

if ('null' != val)

要了解这个方法何时以及为什么有效,请参见下面的详细信息


3
如果(null != val),加引号后它似乎无法正常工作。 - Ananda
在这个问题中,Mr.x将null作为字符串使用了...你的情况可能不同。 - Arsen Mkrtchyan

33

使用 !==,因为使用 != 会导致在 JavaScript 的真值表中出现不可传递的怪异情况。


2
除非你想具体检查“undefined”或“null”。此时,“val!= null”将返回“true”以表示“undefined”或“null”,但不适用于其他类似“0”的falsey值。 - Eric H
在我看来,只有一种情况下!=是一个合法的用例。那就是当与null进行比较时 - 假设您实际上并不关心缺失的值最终是作为null还是undefined - NotX

8

你应该使用严格的不等于比较运算符!==,这样如果用户输入"null",你就不会执行else语句。


2
如果数据输入表单不接受Susan Null的名字,那她肯定会很不开心,哈哈。 - Andez

8

1
仅仅因为一个值是“真实”的并不意味着它就是你需要的值。 - a.anev
如果你想检查一个数字是否被赋值,使用0来判断是不好的解决方案(即使值不为空,0会被判断为假)。最好直接检查值是否等于null(value === null)。 - Alexis_A
如果(value)表示您不接受0作为正值,检查数字是否为0是一个非常不同的用例(我提到0在这里是被接受的,所以我看不出这个解决方案如何适用于您的情况)。 - undefined

5
这应该可以很好地工作。
   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }

5

可能是因为val的值实际上是字符串"null"而不是null值。


2
如果您希望将0作为有效值包含进去:
if (!!val || val === 0) { ... }

0
这将起作用:
if (val) {
    alert("Not null");
} else {
    alert("Null");
}

1
不适用于0(零),未定义,false,“”(空字符串)或任何falsy值。 - Gil Epshtain

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