2013-03-04 2 views
3

У меня есть код, который возвращает неожиданные результаты.javascript IsNaN и 0

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. Вот JSFiddle с результатами: http://jsfiddle.net/n2Uy7/

Может кто-нибудь объяснить, почему это так? Если это 0, он не должен попадать ни в if, ни в операторы else if. Означает ли JS, что 0 - NaN, хотя typeof указывает, что это число?

+3

Прежде всего, вы никогда не должны использовать 'parseInt()', не передавая параметр radix. – jfriend00

+0

@ jfriend00 - Я не знал об этом; Я не помню, что проблема была в последний раз, когда я использовал функцию (где-то около 1997 ...). Что касается стандартной нумерации, я использую 10 для базы 10? – EmmyS

+0

Да, используйте '10'. Причина в том, что без этого второго параметра для radix, если в строке, которая должна быть проанализирована, есть ведущий нуль или ведущий '0x',' parseInt() 'может рассматривать его как восьмеричную или шестнадцатеричную. Я говорю «может», потому что это зависит от браузера и находится ли вы в строгом режиме. (И, конечно, для введенных пользователем данных пользователь может ввести ведущее 0, что маловероятно, что может показаться - не проблема для ваших жестко заданных значений выбора, но все же хорошо привыкать всегда поставлять основание.) – nnnnnn

ответ

7

0 == ''true так что часть isNaN даже не оценивается.

Использовать === вместо ==.

+0

Thank вы. Я не знал, что 0 считается равным пустой строке. – EmmyS

+0

'==' делает какое-то принуждение типа. '===' не делает. MDN дает [более подробное объяснение] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Comparison_Operators). – nnnnnn

+0

+1 для "use === вместо ==" – contactmatt

2

Вы сравниваете знаки "just" double equals так, чтобы 0 == '' (попробуйте его в консоли вашего браузера).

Один из способов устранить проблему заключается в том, чтобы вместо этого использовать тройные равные. Другой способ - полностью удалить parseInt, так что ccVal останется строкой. Сравнение строк с строками будет вести себя так, как ожидалось ('' != '0').

Снятие parseInt также решит еще одну проблему (вы не проходите в радиусе, но вы должны). Почему это все равно?

Смежные вопросы