2013-06-05 3 views
0

У меня есть очень, очень простой логический тест количества лицензий клиент приобрел по сравнению с числом, они использовали:Оператор JavaScript IF, неправильно оценивающий TRUE - почему?

else if(utype == "3"){ 
      var tech_lic = $("#technician_lic").val(); 
      console.log('tech lic = ' + tech_lic) 
      var tech_allow = $("#technician_lic_allow").val(); 
      console.log('tech allow = ' + tech_allow) 
      if(tech_lic >= tech_allow) 
      { 
       alert("You must purchase more licenses to create this Technician"); 
       return false; 
      } 

я бросил в console.log заявления, пытаясь отладки это - обычно они не существует.

console.log, когда я нажимаю кнопку «Добавить»:

tech lic = 4 application.js:262 
tech allow = 100 application.js:264 

Затем мы попали «Вы должны приобрести дополнительные лицензии» предупреждение в окне.

ЧТО ТАКОЕ HECK?

Как 4> = 100 оценить истину?

+1

Параметр 'if' заявление делает правильную оценку. Это лексикографическое сравнение, и, как таковое, возвращает true, поскольку «4» больше, чем «100». –

ответ

7

Поскольку .val возвращает строку. '4' действительно больше или равно '100'. Сначала передайте значения числам (если вы знаете, что они всегда являются номерами для целей этого сравнения).

if (+tech_lic >= +tech_allow) 
+0

Ничего себе, никогда не видел этого трюка раньше. – rixo

+0

Это неявное преобразование. С точки зрения производительности неявные преобразования занимают тот же промежуток времени, что и использование parseInt, поэтому это допустимый листинг. Будьте осторожны с цепью, как это, хотя, если вы используете неявное приведение нескольких элементов в строке, некоторые круглые скобки могут пройти долгий путь. –

+1

@TravisJ Что вы подразумеваете под словом «некоторые круглые скобки могут пройти долгий путь?» –

1

Строка «4» больше, чем «100», тогда как число 4 меньше, чем 100.

0

ли это так: -

if(Number(tech_lic) >= Number(tech_allow)) 
{ 
    // Do your stuff 
} 
3

Вы оцениваете их как строки, так что "4" больше, чем "100".

Вам нужно будет изгонять их как целые числа перед сравнением:

var tech_lic = parseInt($("#technician_lic").val(), 10); 
var tech_allow = parseInt($("#technician_lic_allow").val(), 10); 
1

Это не то, что 4 >= 100 правда, то, что "4" >= "100" верно.

Значения, которые вы получаете, являются строками, поэтому они будут сравниваться лексически, а не численно.

разбирает значения в число:

var tech_lic = parseInt($("#technician_lic").val(), 10); 
var tech_allow = parseInt($("#technician_lic_allow").val(), 10); 
Смежные вопросы