我不明白javascript的行为。
我正在对jquery ui对话框进行表单验证。这似乎是一个javascript问题,而不是jquery问题。
对于验证,我对每个返回true或false的字段执行一个函数,并且一个布尔变量接收连续&&的结果。运营商。像这样:
bValid = checkRegexp(validite, /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/, "Entrez la date de validit\350 sous la forme JJ/MM/AAAA." );
bValid = bValid && checkLength(libelle, "Libell\351", 1, 100 );
bvalid = bValid && checkLength(description, "Description", 1, 250);
以下是有关验证功能的信息:
function checkLength( o, n, min, max ) {
if ( o.val().length > max || o.val().length < min ) {
o.addClass( "ui-state-error" );
if(o.val().length == 0) { textError = textError + "le champ " + n + " est requis !\n"; }
else { textError = textError + "Taille de " + n + " entre " + min + " et " + max + "caract\350res.\n"; }
return false;
} else {
return true;
}
}
function checkRegexp( o, regexp, n ) {
if (!(regexp.test(o.val()))) {
o.addClass( "ui-state-error" );
textError = textError + n + "\n";
return false;
} else {
return true;
}
}
预期的行为是所有函数都被执行,并且错误消息的串联将所有错误字段标记为错误。有关信息,bValid变量包含连续&amp;&amp;的布尔结果。运营商。最后一点有效;没问题。
真正的行为是当函数返回false
时,似乎没有执行以下函数。结果是只有第一个错误字段被标记为错误。
为什么?
答案 0 :(得分:7)
因为&&
运算符'短路'。这意味着,由于编译器/解释器/任何知道&&
运算符的双方操作数必须为真,如果第一个操作数为假,则第二个操作符不会被执行。
如果您希望您的函数执行肯定,只需交换&&
的操作数顺序:
bValid = checkRegexp(validite, /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/, "Entrez la date de validit\350 sous la forme JJ/MM/AAAA." );
bValid = checkLength(libelle, "Libell\351", 1, 100 ) && bValid;
bvalid = checkLength(description, "Description", 1, 250) && bValid
答案 1 :(得分:4)
JavaScript使用short circuit evaluation。即假,任何东西总是假的,所以为什么还要做第二次计算?
答案 2 :(得分:1)
因为Javascript会简化并“优化”...如果已经双&&
操作的第一个操作数为false,则结果肯定是假的,因此它不会执行第二部分。
答案 3 :(得分:1)
这叫做短路。 &&
可以在逻辑上被视为“and-also”语法,如果第一个表达式失败,则不评估第二个表达式。如果您希望第二个表达式无论第一个表达式如何处理,您可以考虑撤消其顺序或尝试:
bValid = bValid & checkLength(description, "Description", 1, 250);
虽然,这在功能上等同于
bValid = checkLength(description, "Description", 1, 250);
答案 4 :(得分:0)
让我们用实际输出重写:
bValid = checkRegexp(validite, /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/, "Entrez la date de validit\350 sous la forme JJ/MM/AAAA." );
bValid = bValid && checkLength(libelle, "Libell\351", 1, 100 );
bvalid = bValid && checkLength(description, "Description", 1, 250);
false = checkRegexp(validite, /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}$/, "Entrez la date de validit\350 sous la forme JJ/MM/AAAA." );
bValid = false && checkLength(libelle, "Libell\351", 1, 100 );
bvalid = false && checkLength(description, "Description", 1, 250);
当它击中假的那一刻它将停止执行该条件。