簡體   English   中英

當布爾函數返回false時,&&運算符和執行

[英]&& operator and execution when boolean function returns 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 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變量包含連續的&&運算符的布爾結果。 最后一點有效; 沒問題。

真正的行為是當函數返回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 = checkLength(libelle, "Libell\351", 1, 100 )     && bValid;
bvalid = checkLength(description, "Description", 1, 250) && bValid

JavaScript使用短路評估 即假,任何東西總是假的,所以為什么還要做第二次計算呢?

因為Javascript會簡化和“優化”......如果已經是雙&&操作的第一個操作數是假的,那么結果肯定是假的,所以它不會執行第二部分。

它被稱為短路。 &&可以在邏輯上被視為“and-also”語法,如果第一個表達式失敗,則不評估第二個表達式。 如果您希望第二個表達式無論第一個表達式如何處理,您可以考慮撤消其順序或嘗試:

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

雖然,這在功能上等同於

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

讓我們用實際輸出重寫:

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);

它擊中假的那一刻它將停止執行該條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM