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