为什么JavaScript验证会根据条件的顺序工作?

为什么JavaScript验证会根据条件的顺序工作?,javascript,validation,conditional-statements,Javascript,Validation,Conditional Statements,我正在编写一个验证一个文本的小函数,我对验证感到非常不安 问题是:当我尝试将字符串与null进行比较以检查cancel按钮时,它的工作方式取决于我放置条件的位置!它似乎只有在验证开始时才起作用。我也用括号对每个条件进行了测试,但得到了相同的结果 这里发生了什么事 我在Stack Overflow上找到了这个答案,但它是针对Python的,我不太理解它: 密码 首先要检查文本是否不是null,因为如果该条件失败,则不会计算其余条件,因为违反了&&不变量。如果文本为空,并且在其他检查之后进行空检查,

我正在编写一个验证一个文本的小函数,我对验证感到非常不安

问题是:当我尝试将字符串与null进行比较以检查cancel按钮时,它的工作方式取决于我放置条件的位置!它似乎只有在验证开始时才起作用。我也用括号对每个条件进行了测试,但得到了相同的结果

这里发生了什么事

我在Stack Overflow上找到了这个答案,但它是针对Python的,我不太理解它:

密码
首先要检查文本是否不是null,因为如果该条件失败,则不会计算其余条件,因为违反了&&不变量。如果文本为空,并且在其他检查之后进行空检查,您将收到一个错误。

您希望首先检查文本是否为空,因为如果该条件失败,将不会计算其余条件,因为违反了&&不变量。如果文本为null,并且null检查在其他检查之后进行,您将收到一个错误。

,因为假设我们有以下值:

var text = 'Tim is an alright person',
    notText = null
如果我们试图访问notText的属性,我们将得到一个错误,因为null没有像length这样的属性。因此,在代码中:

if(text.length){...}
因为文本具有长度属性,所以可以工作。但是,以下情况不起作用:

if(notText.length){...}
因为notText没有长度属性。它将抛出TypeError错误,因为您试图对不允许的null类型执行某些操作


所以,我们需要文本首先检查空值,因为它将在尝试其他表达式之前提前失败。

因为我们有以下值:

var text = 'Tim is an alright person',
    notText = null
如果我们试图访问notText的属性,我们将得到一个错误,因为null没有像length这样的属性。因此,在代码中:

if(text.length){...}
因为文本具有长度属性,所以可以工作。但是,以下情况不起作用:

if(notText.length){...}
因为notText没有长度属性。它将抛出TypeError错误,因为您试图对不允许的null类型执行某些操作

所以,我们需要文本在尝试其他表达式之前,首先检查空值,因为它将提前失败。

简单地说:

如果您计算text.anyproperty==null,您会询问var text的anyproperty是否为null,但这样您就理所当然地认为text不是null,如果text实际为null,则会出现您提到的错误TypeError

为了避免这个陷阱,您必须先询问文本,然后再询问text.anyproperty,如:iftext!=null&&text.anyproperty!=无效的这样,如果文本!=null失败,text.anyproperty!=null将不会被计算,也不会得到TypeError

为了进行验证,请使用iftext!=null&&text.anyproperty!=null您可以实现您的目标,因为如果text为null,则检查text.anyproperty没有任何意义这就是为什么表达式的其余部分(&&)之后的代码不被计算的原因

希望这有助于你更好地理解这件事:

简单地说:

如果您计算text.anyproperty==null,您会询问var text的anyproperty是否为null,但这样您就理所当然地认为text不是null,如果text实际为null,则会出现您提到的错误TypeError

为了避免这个陷阱,您必须先询问文本,然后再询问text.anyproperty,如:iftext!=null&&text.anyproperty!=无效的这样,如果文本!=null失败,text.anyproperty!=null将不会被计算,也不会得到TypeError

为了进行验证,请使用iftext!=null&&text.anyproperty!=null您可以实现您的目标,因为如果text为null,则检查text.anyproperty没有任何意义这就是为什么表达式的其余部分(&&)之后的代码不被计算的原因


希望这有助于你更好地理解这件事:

多么好的解释啊!现在我明白了!非常感谢。多好的解释啊!现在我明白了!非常感谢。