为什么这个JavaScript验证的工作取决于条件的顺序?

时间:2016-11-15 22:03:12

标签: javascript validation conditional-statements

我正在编写一个验证一个文本的小函数,由于验证我感到非常沮丧。

问题是:当我尝试将字符串比较为null(检查取消按钮)时,它取决于我放置条件的位置!它似乎只在我放在验证开始时才起作用。我已经用每个条件的括号测试了它,但我得到了相同的结果。

这里发生了什么事?

我在Stack Overflow上找到了这个答案,但它适用于Python,我不太了解它:

Does the Order of Conditions affect Performance?

代码

function validate()
{
    var isValid = false;

    var text;

    while (isValid == false)
    {
        text = prompt("Enter one text between 1 and 10 characters, no empty, blank spaces, only numbers");

        /*
          WITH NULL (CANCEL BUTTON) VALIDATION AT THE BEGINNING,
          IT WORKS:
        */

        if (text != null &&
            (text.length >= 1 && text.length <= 10) &&
            text != "" &&
            isNaN(text) == false)
        {
            isValid=true;
        }

        /*
          WITH NULL (CANCEL BUTTON) VALIDATION AT ANOTHER POSITION, IT DOESN´T WORK:

          It generates "TypeError:Text is null"
        */

        if ( (text.length >= 1 && text.length < 10)  &&
             isNaN(text) == false && text != "" && text !=null)
        {
              isValid = true;
        }
    }

    if (isValid == true)
    {
        // Some code when validation is OK
    }
}

3 个答案:

答案 0 :(得分:2)

您想先检查文本是否为空,因为如果该条件失败,则不会评估其余条件,因为&amp;&amp;不变量已被侵犯。如果文本为null,并且在进行其他检查后进行空检查,则会收到错误。

答案 1 :(得分:1)

因为我们说我们有以下价值观:

var text = 'Tim is an alright person',
    notText = null

如果我们尝试访问notText的属性,我们会收到错误,因为null没有length之类的属性。所以,在代码中:

if(text.length){...}

有效,因为text具有length属性。但是,以下内容不起作用:

if(notText.length){...}

因为notText 具有length属性。它将抛出TypeError的错误,因为您尝试使用不允许的null类型执行某些操作。

因此,我们首先需要text != null检查,因为在尝试其他表达式之前它会提前失败。

答案 2 :(得分:1)

简单来说:

如果您评估text.anyproperty == null,那么您询问var anyproperty的{​​{1}}是否为text,但这样您就认为null是理所当然的} {}不是text,如果null实际为text,则会因您提到的错误(TypeError)而失败。

为了避免这个陷阱,你必须首先询问null,然后再问text这样:text.anyproperty ...这样,如果if(text != null && text.anyproperty != null)失败,text != null将不会被评估,您将不会得到TypeError。

出于验证目的,使用text.anyproperty != null可以实现目标,因为如果if(text != null && text.anyproperty != null)text,则检查null无效({1}}这就是为什么表达式的其余部分,即text.anyproperty之后的代码未被评估的原因。)

希望这有助于您更好地了解此事:)