3

予期しない結果を返すコードがあります。

HTML:

<select name="cc_dropdown[0]" id="cc-dropdown-0" style="display: none;">
    <option value="">Select a card</option>
    <option value="0" selected="selected">***********8431</option>
    <option value="-1">Use a new card</option>
</select>

JS:

var ccVal = parseInt($("#cc-dropdown-0 option:selected").val());
var errors = [];

if( ccVal == -1 ) {
        if( $('#cc_number-'+bIdx).val().length <= 0 || !isValidCreditCardNo($('#cc_number-'+bIdx).val()) ) {
            errors.push('Invalid Credit card Number');
        }

        if( $('#cc_name-'+bIdx).val().length <= 0 ) {
            errors.push('Please provide the name on the credit card.');
        }

        if($('#cc_exp_month-'+bIdx).val() == ""){
            errors.push('Please Select an Expiration Date.');
        }

        if($('#cc_exp_year-'+bIdx).val() == ""){
            errors.push('Please Select an Expiration Date.');
        }

        if( !isValidZipcode($('#cc_zip-'+bIdx).val())){
            errors.push('Please enter a valid zipcode.');
        }
    }    else if ( ccVal == 'na' || ccVal == '' || isNaN(ccVal)) {
        console.log("ccVal inside else if: " + ccVal);
        console.log("ccVal type: " + typeof ccVal);
        errors.push('Please select a credit card, or enter a new one.')
    }
else {
    console.log("else");
    errors.push("Arg!");
}
console.dir(errors);

この場合、ccValは 0 ですが、else if ステートメントに陥っています。それがまったく数値でない場合にのみ、それが起こると思います。期待される結果は、それが最終的なelseステートメントに分類されることです。結果を含む JSFiddle は次のとおりです: http://jsfiddle.net/n2Uy7/

なぜこれが当てはまるのか、誰でも説明できますか?if0 の場合は、ステートメントまたはステートメントのいずれにもヒットしないはずelse ifです。JS は、0 がtypeof数値であることを示していても、0 を NaN と見なしますか?

4

2 に答える 2

7

0 == ''trueその部分はisNaN評価されません。

===の代わりに使用し==ます。

于 2013-03-04T21:40:34.570 に答える
2

「ちょうど」二重の等号と比較しているので、0 == ''(ブラウザのコンソールで試してください)。

この問題を解決する 1 つの方法は、代わりにトリプル イコールを使用することです。もう 1 つの方法は、をparseInt完全に削除ccValすることで、文字列のままになります。文字列から文字列への比較は、期待どおりに動作します ( '' != '0')。

を削除すると、parseInt別の問題も解決されます (基数を渡していませんが、渡す必要があります)。とにかくなぜそこにあるのですか?

于 2013-03-04T21:40:16.140 に答える