当布尔函数返回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会简化和“优化”......如果双&&操作的第一个操作数是假的,结果肯定是错误的,所以它不会执行第二部分。

链接地址: http://www.djcxy.com/p/13015.html

上一篇: && operator and execution when boolean function returns false

下一篇: Undefined variables, value == false versus !value