如何检查JS中的值是否不为null且不为空字符串


82

是否可以检查Java中的值是否不为null且不为空字符串?我正在使用以下之一:

var data; //get its value from db 
if(data != null && data != '') {
   // do something
}

但是我想知道是否还有另一个更好的解决方案。谢谢。


6
if(data)足以作为它说,在这里
CIsForCookies

1
我尝试了此方法,但在两种情况之一中均无效。
ivva

谢谢大家,我会尝试的。我希望它能起作用。
ivva

undefined根据您的逻辑,这是应触发// do something但不会触发的特殊情况之一。
Salman'A

Answers:


157

如果您确实要确认变量不是null而不是具体不是空字符串,则应编写:

if(data !== null && data !== '') {
   // do something
}

注意,我更改了代码以检查类型相等性(!==| ===)。

但是,如果您只是想确保代码仅针对“合理的”值运行,那么可以像其他人已经指出的那样编写:

if (data) {
  // do something
}

因为在JavaScript中,空值和空字符串都等于false(即null == false)。

这两个代码部分的区别在于,对于第一个部分,每个不是专门为null或为空字符串的值都将输入if。但是,在第二个,每一个真正的十岁上下的价值将进入iffalse0nullundefined和空字符串,不会。


2
0在很多情况下是一个合理的值
Aequitas '18

3
这就是为什么合理一词用引号引起来的原因:)
Gershon Papi,

@Adam如果没有,则可以将其保留为空,然后使用else。这总是会像预期的那样反转。
Nate

这不应该是数据!== null || 数据!==''而不是使用&&?
Imdad

@Imdad OP要求检查该值是否不为null且不是空字符串,因此为否。
Gershon Papi

18

两者null和一个空字符串都是JS中的虚假值。因此,

if (data) { ... }

完全足够。

不过,在旁边有一个注释:我会避免在代码中包含一个可能以不同类型体现的变量。如果数据最终将是一个字符串,那么我最初将使用一个空字符串定义变量,因此您可以执行以下操作:

if (data !== '') { ... }

没有null(或类似的怪异东西data = "0")的妨碍。


11

而不是使用

if(data !== null && data !== ''  && data!==undefined) {

// do something
}

您可以使用以下简单代码

if(Boolean(value)){ 
// do something 
}
  • 直观上为“空”的值(例如0,空字符串,null,undefined和NaN)将变为false
  • 其他值变为真

6

我经常测试真实值以及字符串中的空白:

if(!(!data || data.trim().length === 0)) {
  // do something here
}

如果您的字符串包含一个或多个空格,则该字符串的值为true。


4
if (data?.trim().length > 0) {
   //use data
}

所述?. 可选的链接操作者将短路和返回undefined如果数据是nullishnullundefined),其将计算为在虚假if表达。


老实说,我不知道该运算符。.不幸的是,一些Android浏览器不支持该运算符,但其他方面的支持都还不错!
brandonmack

2

空值和空值都可以按以下方式进行验证:

<script>
function getName(){
    var myname = document.getElementById("Name").value;
    if(myname != '' && myname != null){
        alert("My name is "+myname);
    }else{
        alert("Please Enter Your Name");
    }       
}


1

试试吧----------

function myFun(){
var inputVal=document.getElementById("inputId").value;
if(inputVal){
document.getElementById("result").innerHTML="<span style='color:green'>The value is "+inputVal+'</span>';
}
else{
document.getElementById("result").innerHTML="<span style='color:red'>Something error happen! the input May be empty.</span>";
}
}
<input type="text" id="inputId">
<input type="button" onclick="myFun()" value="View Result">
<h1 id="result"></h1>


1

在本质上,当我们编码为空时,可能意味着以下任何一种情况;

  • 数值等于0
  • 0.0作为浮点值
  • 字符串值中的“ 0”
  • 字符串值中的“ 0.0”
  • 像Null值一样为null,也有可能捕获未定义或可能不捕获
  • 未定义为未定义的值
  • 虚假为虚假的真实值,偶然为0亦为真实,但是如果我们想按原样捕获虚假,该怎么办
  • 空字符串值,无空格或制表符
  • ''仅带空格或制表符的字符串

如OP所述,在现实生活中,我们可能希望对它们全部进行测试,或者有时我们可能仅希望对有限的一组条件进行测试。

通常if(!a){return true;}在大多数时间都可以达到其目的,但是不会涵盖更广泛的条件。

另一轮攻击是 return (!value || value == undefined || value == "" || value.length == 0);

但是,如果我们需要对整个过程进行控制怎么办?

本机核心JavaScript中没有简单的鞭打解决方案,必须采用。考虑到我们放弃了对旧版IE11的支持(坦率地说,即使Windows也是如此),下面的解决方案是在所有现代浏览器中都因沮丧而诞生的;

 function empty (a,b=[])
 {if(!Array.isArray(b)) return; 
 var conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
 if(conditions.includes(a)|| (typeof a === 'string' && conditions.includes(a.toString().trim())))
 {return true;};
 return false;};`

解决方案背后的逻辑是函数具有两个参数ab,a是我们需要检查的值,b是具有设置条件的数组,我们需要从上面列出的预定义条件中排除这些条件。b的默认值设置为空数组[]。

函数的第一次运行是检查b是否为数组,如果不是,则尽早退出该函数。

下一步是计算[null,'0','0.0',false,undefined,'']与数组b之间的数组差异。如果b为空数组,则预定义条件成立,否则它将删除匹配的值。

条件= [预定义集]-[要排除的集] 过滤器函数正是利用它来做的。现在我们在数组集中有条件,我们要做的就是检查value是否在conditions数组中。 包含函数的作用完全在于,无需编写自己讨厌的循环即可让JS引擎完成繁重的工作。

疑难杂症 ,如果我们要一个转换成字符串进行比较,然后0和0.0将运行良好但null和undefined将通过错误阻止整个脚本。我们需要边缘案例解决方案。下面简单|| 如果不满足第一个条件,则覆盖边缘情况。如果不符合要求,则再次运行包括include的早期检查将使您提前退出。

if(conditions.includes(a)||  (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim())))

trim()函数将覆盖更宽的空白,并且制表符仅适用于值,并且仅在边缘情况下起作用。

发挥作用

function empty (a,b=[]){
if(!Array.isArray(b)) return;
conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
if(conditions.includes(a)|| 
(['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
 return true;
} 
return false;
}

console.log('1 '+empty());
console.log('2 '+empty(''));
console.log('3 '+empty('      '));
console.log('4 '+empty(0));
console.log('5 '+empty('0'));
console.log('6 '+empty(0.0));
console.log('7 '+empty('0.0'));
console.log('8 '+empty(false));
console.log('9 '+empty(null));
console.log('10 '+empty(null,[null]));
console.log('11 dont check 0 as number '+empty(0,['0']));
console.log('12 dont check 0 as string '+empty('0',['0']));
console.log('13 as number for false as value'+empty(false,[false]));

让它变得复杂-如果要比较的值是数组自身,并且可以嵌套得尽可能深,该怎么办。如果我们要检查数组中的任何值是否为空,那将是一个边缘业务案例。

function empty (a,b=[]){
    if(!Array.isArray(b)) return;

    conditions=[null,'0','0.0',false,undefined,''].filter(x => !b.includes(x));
    if(Array.isArray(a) && a.length > 0){
    for (i = 0; i < a.length; i++) { if (empty(a[i],b))return true;} 
    } 
    
    if(conditions.includes(a)|| 
    (['string', 'number'].includes(typeof a) && conditions.includes(a.toString().trim()))){
     return true;
    } 
    return false;
    }

console.log('checking for all values '+empty([1,[0]]));
console.log('excluding for 0 from condition '+empty([1,[0]], ['0']));

我在框架中采用的简单而广泛的用例函数;

  • 控制给定情况下空的确切定义是什么
  • 控制重新定义空条件
  • 几乎可以针对字符串,数字,浮点数,真值,空值,未定义和深层数组的所有内容进行比较
  • 考虑到可重用性和灵活性,提出了解决方案。如果要处理一种或两种简单情况,所有其他答案都适用。但是,总是有这样的情况,即在上面的代码片段编码时对空更改的定义在这种情况下可以正常工作。

0

我非常讨厌专门检查空字符串和空字符串,以至于我现在通常只编写并调用一个小函数来为我做。

/**
 * Test if the given value equals null or the empty string.
 * 
 * @param {string} value
**/
const isEmpty = (value) => value === null || value === '';

// Test:
isEmpty('');        // true
isEmpty(null);      // true
isEmpty(1);         // false
isEmpty(0);         // false
isEmpty(undefined); // false

0

function validateAttrs(arg1, arg2, arg3,arg4){
    var args = Object.values(arguments);
    return (args.filter(x=> x===null || !x)).length<=0
}
console.log(validateAttrs('1',2, 3, 4));
console.log(validateAttrs('1',2, 3, null));
console.log(validateAttrs('1',undefined, 3, 4));
console.log(validateAttrs('1',2, '', 4));
console.log(validateAttrs('1',2, 3, 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.