4

javascriptの挙動がわかりません。

jquery ui ダイアログのフォーム検証を行っています。jqueryの問題ではなく、JavaScriptの問題のようです。

検証のために、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

&&オペレーターが「短絡」しているためです。つまり、コンパイラ/インタープリター/何でも演算子の両側のオペランド&&が true でなければならないことを知っているため、最初のオペランドが false の場合、2 番目のオペランドは実行されません。

関数を確実に実行したい場合は、オペランドの順序を次のように入れ替えるだけです&&

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 は短絡評価を使用します。つまり、false AND は常に false であるのに、なぜわざわざ 2 番目の計算を行う必要があるのでしょうか?

于 2012-12-18T19:44:29.523 に答える
1

ショートサーキットといいます。これ&&は、論理的には、最初の式が失敗した場合に 2 番目の式が評価されない "and-also" 構文と見なすことができます。最初の式に関係なく 2 番目の式を処理する場合は、順序を逆にするか、次のことを試すことを検討してください。

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

ただし、機能的には同等です

bValid = checkLength(description, "Description", 1, 250);
于 2012-12-18T19:45:05.157 に答える
1

Javascriptは単純化して「最適化」するため...二重&&操作の最初のオペランドがすでにfalseの場合、結果は確実にfalseになるため、2番目の部分は実行されません。

于 2012-12-18T19:44:36.530 に答える
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);

false になった瞬間に、その条件の実行が停止します。

于 2012-12-18T19:44:36.140 に答える