我想验证日期(在arg中传递为格式化为99/99/9999的字符串)。根据我的需要,空/ null /未定义的字符串应该被认为是好的。
这是我的验证功能:
function isDateValid(date) {
if(date && date.length == 0){
return true;
}
//more checks
}
我得到了奇怪的结果,我无法解释:
使用空字符串(字符串为0个字符长度),条件将被计算为空字符串,因此无法到达return true
使用填充字符串(例如:" 01/01/208"),条件将计算为false
布尔值。
我知道如何更改以使代码按需要运行....但是这让我感到厌倦了解为什么这有两个不同的comportement(一次是字符串,一次布尔)。
我需要一个队长!
添加一些console.log
作为
function isDateValid(date) {
console.log(date);
console.log(date.length);
console.log(date && date.length == 0);
console.log(typeof (date && (date.length == 0)));
if(date && date.length == 0){
return true;
}
//more...
}
将产生以下输出:
答案 0 :(得分:2)
JavaScript的概念为truthy和falsy coercion所以“”(空字符串),null和undefined(以及其他一些)都是假的,所以
if (!date)
return true;
将同时检查date是否为null,undefined或空字符串并返回true。
有关更多信息,请查看有关MDN的文章
答案 1 :(得分:1)
正如其他答案所述,JavaScript有一个真值和假值的概念 - 即当你将它们用作布尔时隐含地被视为true
或false
的值(如if
中所示陈述或条件算子)。
特别是,空字符串是假的。
在你的情况下,你得到一个不同的typeof
,因为&&
布尔运算符在一个假值上被短路。它停止进一步评估并返回左操作数。
所以你输入一个空字符串,&&
停在那里,你得到左边的typeof
- 即空字符串。
您输入非空字符串,&&
继续,您获得其右操作数的typeof
- 即<{1>} 布尔结果date.length == 0
}。