予期しない結果を返すコードがあります。
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/
なぜこれが当てはまるのか、誰でも説明できますか?if
0 の場合は、ステートメントまたはステートメントのいずれにもヒットしないはずelse if
です。JS は、0 がtypeof
数値であることを示していても、0 を NaN と見なしますか?