8

一部の無線グループの値に応じて、ボタンを無効/有効にする必要があります。これらのラジオには、Javaのスーパーセットであるgroovyのフレームワークであるgrailsを使用しているため、いくつかのgroovyコードが入力されています。その説明は、ラジオの値がブール値として定義されているということでした。これは、はい/いいえの答えに対応しているため、当然のことです。

ここで、このボタンを無効/有効にするために、いくつかのjavascriptを使用しますが、ブール値を持つバナナになります。タイトルが示すように、ある時点で、保持する変数と保持するfalse別の変数の間で論理積を実行しますtrue

問題のあるコードは次のとおりです。

var actual = true;
$('.requerido input:radio:checked').each(function() {
    console.log("actual: " + actual);
    console.log("value: " + this.value);
    console.log("actual and value: " + (actual && this.value));
    actual = actual && this.value;
    console.log("actual: " + actual);
});

ご覧のとおり、私はデバッグにconsole.logを使用しています。これは、ある時点でスローされるものです。

actual: true
value: true
actual and value: true
actual: true

actual: true
value: false
actual and value: false
actual: false

actual: false
value: true
actual and value: true
actual: true

つまり、true && false == falseですが、false && true == true?値には引用符がないため、ブール値であることに注意してください(二重引用符で囲まれた文字列を表すChromeコンソールを使用してデバッグしているため、trueと "true"を区別できます)。

何か案は?

また、常に期待どおりに機能するように手動で比較を行うvar x = true && falseことは、問題が存在する変数を伴う突き出しです。

4

6 に答える 6

13

チェックしたラジオボタンからのthis.value入力は、実際にはブール値ではなく、文字列です。文字列とブール値の比較は、このような問題を引き起こす可能性があります。===比較に使用することがベスト プラクティスと見なされる理由の 1 つです。

詳細については、この SO の質問を参照してください。JavaScript === と == : どの「等号」演算子を使用するかは重要ですか?

于 2012-04-23T05:25:55.227 に答える
3

&&は次のことを行うことに注意してください。

false に変換できる場合は expr1 を返します。それ以外の場合は expr2 を返します。

ソース

したがって、次のような場合:

var truish=true;//interchangeable with anything different than 0,"",false,null,undefined,NaN
var falsish=null;//interchangeable with 0,"",false,null,undefined,NaN

alert(truish&&falsish);//null (falsish was returned)

返される値は必ずしもブール値であるとは限りません。これに対する解決策は、ブール値を強制することです!(x&&y)

だから私の推測では、このようなことが起こっているということです

于 2012-04-23T05:25:35.587 に答える
2

論理演算子で計算しようとしている場合は、次のことを覚えておいてください。

var result = true && "false";// always results (string) "false"
var result = true && "true";// always results (string) "true"
var result = false && "true";// always results (boolean) false
var result = false && "false";// always results (boolean) false
var result = "true" && true;// always results (boolean) true
var result = "true" && false;// always results (boolean) false
var result = "false" && true;// always results (boolean) true
var result = "false" && false;// always results (boolean) false
var result = "true" && "true";// always results (string)"true"
var result = "true" && "false";// always results (string) "false"
var result = "false" && "true";// always results (string) "true"
var result = "false" && "false";// always results (string) "false"

理由: javascript は最初のオペランドを判断し、true の場合は 2 番目のオペランドを返し、それ以外の場合は false を返します。それはちょうどのように:

var first = true
var second = "false";
if (first) {
    result = second;
} else {
    result = false;
}

また

result = first ? second : false;

これは、JavaScript 論理演算子が実際に機能する方法です。異なる変数タイプ間で厳密な比較を実行する必要があります。

result = true && (value==="false");

空でない文字列は (boolean)true に等しく、"false" であっても同じです。

HTML要素の属性は「文字列」であることを覚えておいてください

于 2012-04-23T05:44:33.953 に答える
1

これは、ラジオ コントロールの値 (の 1 つ) で何かを行う必要があります。プレーンな JavaScript では、これは期待どおりに評価されるためです。

function boolx(tf,val){ 
  var test = tf && val;
  console.log([tf,val,tf && val,test]); 
}
tf(true,false); //=> [true,false,false,false]
tf(false,true); //=> [false,true,false,false]

は実際には文字列であるため、おそらく明示的な変換がthis.value役立ちます。this.value

var actual = true;
$('.requerido input:radio:checked').each(function() {
    var val = /true/i.test(this.value);
    console.log("actual: " + actual);
    console.log("value: " + val);
    console.log("actual and value: " + (actual && val));
    actual = actual && val;
    console.log("actual: " + actual);
});
于 2012-04-23T05:23:19.530 に答える
0

ビットワイズと&バイスを試してください&&。後者は条件付き比較には適していますが、変数に値を代入する場合には適切ではありません。

于 2012-04-23T05:22:15.740 に答える
0

これは本当にやりたいことですか?:

actual = actual && this.value;

それは次と同じです:

if (actual) {
    actual = this.value;
}

actualは常にtrueコードで定義されているとおりであるため、ブール値ではありませんactualthis.value

于 2012-04-23T05:23:05.517 に答える