Функция 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