Почему isNaN ("") равно ложному - PullRequest
148 голосов
/ 05 мая 2009

У меня быстрый вопрос (надеюсь!). В JS почему isNaN(" ") оценивается как ложное, а isNaN(" x") оценивается как истинное?

Я выполняю числовые операции над полем ввода текста и проверяю, является ли поле пустым, "" или NaN. Когда кто-то вводит в поле несколько пробелов, моя проверка завершается неудачно на всех трех, и я не понимаю, почему он проходит проверку isNAN.

Спасибо!

Ответы [ 22 ]

0 голосов
/ 23 июля 2015

Функция isNaN ожидает число в качестве аргумента, поэтому аргументы любого другого типа (в вашем случае строка) будут преобразованы в число до выполнения фактической логики функции. (Учтите, что NaN также является значением типа Number!)

Btw. это характерно для всех встроенных функций - если они ожидают аргумент определенного типа, фактический аргумент будет преобразован с использованием стандартных функций преобразования. Существуют стандартные преобразования между всеми основными типами (bool, string, number, object, date, null, undefined.)

Стандартное преобразование для String в Number может быть вызвано явно с помощью Number(). Итак, мы можем видеть, что:

  • Number(" ") оценивается как 0
  • Number(" x") оценивается как NaN

Учитывая это, результат функции isNaN полностью логичен!

Реальный вопрос в том, почему стандартное преобразование строк в числа работает так, как оно работает. Преобразование строки в число действительно предназначено для преобразования числовых строк, таких как «123» или «17.5e4», в эквивалентные числа. Преобразование сначала пропускает начальный пробел (поэтому «123» является действительным), а затем пытается проанализировать остатки как число. Если он не может быть проанализирован как число («x» - нет), то результатом будет NaN. Но есть явное специальное правило, что строка, которая является пустой или содержит только пробел, преобразуется в 0. Так что это объясняет преобразование.

Ссылка: http://www.ecma -international.org / ecma-262 / 5.1 / # sec-9.3.1

0 голосов
/ 12 июля 2013

А как же

function isNumberRegex(value) {        
    var pattern = /^[-+]?\d*\.?\d*$/i;
    var match = value.match(pattern);
    return value.length > 0 && match != null;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...