4

我不理解 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 变量包含连续 && 运算符的布尔结果。最后一点有效;没问题。

真正的行为是,当函数 return 时false,似乎没有执行以下函数。结果是只有遇到的第一个错误字段被标记为错误。

为什么 ?

4

5 回答 5

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
于 2012-12-18T19:44:57.933 回答
4

JavaScript 使用短路评估。即假并且任何事情总是假的,那么为什么还要进行第二次计算呢?

于 2012-12-18T19:44:29.523 回答
1

因为 Javascript 会简化和“优化”……如果双重&&操作的第一个操作数已经是假的,结果肯定是假的,所以它不会执行第二部分。

于 2012-12-18T19:44:36.530 回答
1

这叫短路。可以在逻辑上将其&&视为“and-also”语法,如果第一个表达式失败,则不计算第二个表达式。如果您希望处理第二个表达式而不管第一个表达式,您可以考虑颠倒它们的顺序或尝试:

bValid = bValid & checkLength(description, "Description", 1, 250);

虽然,这在功能上等同于

bValid = checkLength(description, "Description", 1, 250);
于 2012-12-18T19:45:05.157 回答
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);

一旦它命中假,它将停止执行该条件。

于 2012-12-18T19:44:36.140 回答