Javascript条件空字符串

Javascript条件空字符串,javascript,validation,date,conditional-statements,Javascript,Validation,Date,Conditional Statements,我想验证一个日期(在arg中以99/99/9999格式的字符串形式传递)。根据我的需要,空/空/未定义的字符串应该被认为是好的 下面是我的验证函数: function isDateValid(date) { if(date && date.length == 0){ return true; } //more checks } 我得到了奇怪的结果,我无法解释: 对于空字符串(字符长度为0的字符串),条件将被计算为空字符串,因此不会达

我想验证一个日期(在arg中以99/99/9999格式的字符串形式传递)。根据我的需要,空/空/未定义的字符串应该被认为是好的


下面是我的验证函数:

function isDateValid(date) {
    if(date && date.length == 0){
        return true;
    }
    //more checks
}

我得到了奇怪的结果,我无法解释:

  • 对于空字符串(字符长度为0的字符串),条件将被计算为空字符串,因此不会达到
    返回true

  • 使用填充字符串(例如:“01/01/2018”)将条件评估为
    false
    boolean

我知道如何更改以使代码按需要运行。。。。但这让我很难理解为什么它有两个不同的组件(一个字符串,一个布尔值)

我需要一个队长


添加一些
console.log
as

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...
}
将产生以下输出:


这里是一个fiddle,JavaScript有和的概念,因此“”(空字符串)、null和undefined(以及其他一些)都是错误的,所以

if (!date)
    return true;
将同时检查日期是否为null、未定义或空字符串,并返回true

有关更多信息,请查看有关MDN的文章


正如其他答案所述,JavaScript有一个truthy和falsy值的概念——即当您将值用作布尔值(如
if
语句或带条件运算符)时,隐式地将其视为
true
false

特别是,空字符串是错误的


在您的例子中,您会得到一个不同的
typeof
,因为
&&
布尔运算符在falsy值上短路。它停止进一步求值并返回左操作数

所以你输入一个空字符串,
&&
停在那里,你得到左边的
类型,即空字符串的类型


输入一个非空字符串,
和&
继续,然后获得其右操作数的
typeof
——即
date.length==0的布尔结果

你能在小提琴中创造出最小的复制品吗?输入和预期输出是什么……这里是:@phuzi刚刚发布了一个答案,解释了关于什么是“falsy”。例如,空字符串是falsy。我更新了你的jsfiddle:Well-documented答案,但是@Lyosha Korogoda的答案很好地解释了为什么在我的情况下,行为不同,我会接受他的答案。