javascript检查不为空


131

下面是一个代码片段,我们在其中检索表单值。在进一步处理之前,请检查该值是否不为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");
}

任何想法为什么会这样发生。


2
发生CW是因为有6个以上的用户编辑了问题。

!==代替!=
GetBackerZ

Answers:


78

这是因为val不是null,但包含'null'为字符串。

尝试检查是否为“ null”

if ('null' != val)

有关何时以及为何可行的说明,请参见下面的详细信息


2
应该是if(null!= val)以某种方式无法使用引号
Ananda

Mr.x在问题中,null为字符串...您的情况可能有所不同
Arsen Mkrtchyan

145

这将为您解决问题

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

22
虽然从技术上讲这是可行的,但双倍不(!!)是一种编程的伪指令。它实际上等效于if(val),阅读起来更加清晰。我会坚持到(仅供参考Ujwal,!! VAL应在C或C ++技术上也工作)在这里看到的javascript'感实性的价值观:janosch.woschitz.org/javascript-equality-comparison
威尔巴克

2
怎么样if(!Boolean(val))
thedjaney

1
!! 只是一个双重否定,所以它的字面意思是if(val.exists)。我仍然喜欢它的外观!
Kurai Bankusu 2013年

12
如果val = 0因为!!0评估为假,这将失败
punkrockpolly

3
这不是简单的双重否定。这是一个正在转变的双重否定。您基本上是将变量转换为布尔值。有很多说关于这个问题,但我只想说,在情况下,您的变量是0falsenullundefined或一些这样的价值解析为true一个!,你会得到false的!。完全不要使用它。
Guy Passy

83

有3种检查“ not null”的方法。我的建议是使用严格版本。

1.严格的版本

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

严格版本不使用“严格平等比较算法” http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.6。的!==与“ !=运算符” 相比,“ 运算符具有更快的性能,因为“严格平等比较算法”不键入值。

2.非严格非版本

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

非严格版本使用“抽象平等比较算法” http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3。在!=具有较低的性能,比!==因为抽象平等比较算法类型转换值操作。

3.双重非版本

if (!!val) { ... }

Double Not版本的!!性能要比严格非版本!==和非严格非版本!=https://jsperf.com/tfm-not-null/6)都快。然而,它会强制转换“Falsey”的价值观一样undefined,并NaN为假(http://www.ecma-international.org/ecma-262/5.1/#sec-9.2),这可能导致意外的结果,它具有可读性变得更糟,因为null没有明确说明。


这很奇怪。!!val为我工作,但val!==null没有。为什么?
TheLogicGuy

@TheLogicGuy-的数据类型是val什么?console.log(typeof val)
tfmontague '16

数。该代码从数组中删除“坏”值(null,0等)。这里是代码:pastebin.com/L7Z1BtuL
TheLogicGuy '16

1
@TheLogicGuy-您的实际问题与null无关。NaN未正确过滤-它将始终返回true。这应该起作用:!(isNaN(val)&&(typeof val!==“ undefined”))。在Javascript中,有一个称为“ Truthy”和“ Falsey”的概念。double-not运算符!!将删除的不仅仅是null。它会转换NaNundefined进入一种虚假的为好。这就是为什么使用double not-operator时数组可以正确过滤的原因!!
tfmontague '16

30

使用!==as !=将使您进入一个非传递性JavaScript真值表怪异世界。


除非您要专门检查undefinednull。在这种情况下,val != null会传回trueundefined或不会传回)null其他假值(例如)0
埃里克H

8

您应该使用严格的not equals比较运算符,!==这样,如果用户输入内容,"null"您就不会进入else


1
如果Susan Null不在数据输入表单中接受她的名字,她会很不高兴
Andez

5

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


3

这应该工作正常。

   if(val!= null)
    {
       alert("value is "+val.length); //-- this returns 4
    }
    else
    {
       alert("value* is null");
    }


1

这将起作用:

if (val) {
    alert("Not null");
} else {
    alert("Null");
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.