我正在编写一个验证一个文本的小函数,由于验证我感到非常沮丧。
问题是:当我尝试将字符串比较为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
}
}
答案 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
之后的代码未被评估的原因。)
希望这有助于您更好地了解此事:)