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/

谁能解释为什么会这样?如果它是 0,它不应该命中 theifelse if语句。JS 是否认为 0 是 NaN,即使typeof表明它是一个数字?

4

2 回答 2

7

0 == ''所以trueisNaN部分甚至没有得到评估。

使用===而不是==.

于 2013-03-04T21:40:34.570 回答
2

您正在与“只是”双等号进行比较,所以0 == ''(在浏览器的控制台中尝试)。

解决此问题的一种方法是改用三等号。另一种方法是parseInt完全删除,所以ccVal将保留一个字符串。字符串到字符串的比较将按预期进行('' != '0')。

删除parseInt也可以解决另一个问题(您没有传入基数,但您必须)。为什么它仍然存在?

于 2013-03-04T21:40:16.140 回答