![](/img/trans.png)
[英]Call a function when a Boolean is true using the AND operator (&&)
[英]&& 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.