【问题标题】:Javascript conditional empty stringJavascript条件空字符串
【发布时间】:2018-04-17 10:11:33
【问题描述】:

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


这是我的验证函数:

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

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

  • 对于空字符串(字符长度为 0 的字符串),条件被评估为空字符串,因此不会达到 return true

  • 使用填充字符串(例如:“01/01/2018”),条件被评估为 false 布尔值。

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

我需要一个队长!


添加一些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...
}

将产生以下输出:

这是一个小提琴https://jsfiddle.net/v8easudj/2/

【问题讨论】:

  • 你能在小提琴中创建一个最小的复制吗?输入和预期输出是什么...
  • @phuzi 刚刚发布了一个答案,向您解释了什么是“虚假”。例如,一个空字符串是虚假的。我更新了你的 jsfiddle:jsfiddle.net/v8easudj/7

标签: javascript validation date conditional-statements


【解决方案1】:

JavaScript 有 truthyfalsy coercion 的概念,所以 ""(空字符串)、null 和 undefined(以及其他一些)是错误的,所以

if (!date)
    return true;

将同时检查日期是否为 null、未定义或空字符串并返回 true。

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

【讨论】:

  • 有据可查的答案,但正如@Lyosha Korogoda 的回答很好地解释了为什么我的行为举止不同,我会接受他的回答。
【解决方案2】:

正如其他答案所述,JavaScript 具有真值和假值的概念——即,当您将它们用作布尔值时,它们被隐式视为 truefalse(如在 if 语句或条件运算符中) .

尤其是空字符串是虚假的。


在您的情况下,您会得到一个不同的 typeof,因为 && 布尔运算符在虚假值上短路。它停止进一步评估并返回左操作数。

所以你输入一个空字符串,&& 停在那里,你会得到左边的 typeof - 即空字符串。

你输入一个非空字符串,&& 继续,你得到它的右操作数的typeof - 即date.length == 0boolean 结果。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2011-10-21
    • 2021-02-23
    • 1970-01-01
    • 2018-11-28
    • 2019-04-19
    • 1970-01-01
    • 2019-11-01
    • 2013-05-12
    相关资源
    最近更新 更多