Сравнение parseInt с NaN в ActionScript 3

В документации AS3 указано, что если вы передадите строку в parseInt, которая не является числом, она вернет NaN. Однако, когда я пытаюсь сравнить с NaN, компилятор выдает следующую ошибку:

Warning: 1098: Illogical comparison with NaN. This statement always evaluates to false.

Заявление на самом деле верно. Сравнение с NaN всегда будет возвращать false. Как я могу сравнить с NaN, чтобы определить, было ли то, что было проанализировано, NaN?

if( parseInt("test") == NaN )
{
   // do something (never gets here)
}

person Luke    schedule 18.10.2010    source источник


Ответы (3)


Сравните с функцией isNaN().

person alxx    schedule 18.10.2010
comment
Шлепнуть по лбу. Конечно. Теперь я помню, что у меня была такая же проблема в AS2 несколько лет назад. Почему в документации parseInt нет ссылки на функцию isNaN? - person Luke; 19.10.2010

Используйте глобальную функцию isNaN().

if(isNaN(parseInt("test")))
{
   // do something 
}
person Amarghosh    schedule 18.10.2010

Все правильно, используйте функцию isNaN():

http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/package.html#isNaN()

Мне никогда не нравился этот метод. Я предпочитаю тестировать на положительный результат.

Интересно, что если число равно NaN, то оно не будет равно самому себе:

var parsed_int:Number = parseInt("test");
if(parsed_int != parsed_int)
  trace("NaN");

Поэтому проверка на соответствие числа самому себе должна дать положительный результат:

var parsed_int:Number = parseInt("123");
if(parsed_int == parsed_int)
  trace("Number");

Не очень понятно, каковы ваши намерения при чтении кода, поэтому обязательно прокомментируйте его, если вы его используете.

Или вы можете добавить функцию верхнего уровня:

function isNumber(num:Number):Boolean{
  return num == num;
}

И примечание для любителей оптимизации. Встроенная версия самая быстрая.

Просто для справки: http://www.adobe.com/livedocs/flash/9.0/ActionScriptLangRefV3/package.html#parseInt()

person Joony    schedule 18.10.2010
comment
Однако функция isNaN является самодокументируемой. Без комментария, объясняющего, почему вы сравниваете значение с самим собой, это выглядит как избыточный фрагмент кода. - person Sly_cardinal; 19.10.2010
comment
Да, но мне всегда интересно узнать, как что-то работает. Кроме того, если вы хотите что-то сделать только в том случае, если parseInt возвращает число, вы получите код вроде if(!isNaN(parseInt(test))). Разве это не число? Это просто некрасиво, на мой взгляд. - person Joony; 19.10.2010
comment
NaN – это не просто число, а набор чисел определенного формата. Более того, спецификация ECMA категорически запрещает вам используйте NaN в сравнениях: результат всегда ложный. - person Michael Antipin; 15.12.2016