当布尔函数返回false时运算符&执行
我不明白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 validit350 sous la forme JJ/MM/AAAA." );
bValid = bValid && checkLength(libelle, "Libell351", 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 + "caract350res.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变量包含连续&&运算符的布尔结果。 最后一点起作用; 没问题。
真正的行为是,当一个函数返回false
,下面的函数似乎不会被执行。 结果是只有第一个错误的字段被标记为错误。
为什么?
因为&&
操作符是“短路”的。 这意味着,因为编译器/解释器/无论是否知道&&
操作符的双方操作数必须为真,如果第一个操作数为假,那么第二个操作数不会被执行。
如果你想让你的函数确实执行,只需交换&&
的操作数的顺序:
bValid = checkRegexp(validite, /^(0?[1-9]|[12][0-9]|3[01])[/-](0?[1-9]|1[012])[/-]d{4}$/, "Entrez la date de validit350 sous la forme JJ/MM/AAAA." );
bValid = checkLength(libelle, "Libell351", 1, 100 ) && bValid;
bvalid = checkLength(description, "Description", 1, 250) && bValid
JavaScript使用短路评估。 即错误和任何事情总是错误的,那么为什么还要做第二次计算呢?
因为Javascript会简化和“优化”......如果双&&
操作的第一个操作数是假的,结果肯定是错误的,所以它不会执行第二部分。
上一篇: && operator and execution when boolean function returns false