IsNaN возвращает false для букв

63
6

У меня есть текстовое поле:


<input type="number" min="0" max="100" value="1" class="form-control" data-bind="value: number,  valueupdate:'afterkeydown'" required="">

Он привязан к этому viewModel:


var ViewModel = function () {
var self = this;
self.number = ko.observable(1);
}

Позже в viewModel у меня есть функция, где я проверяю, действительно ли значение Number действительно число и больше одного:


if (self.number() < 1 || isNaN(self.number()) {
console.log(isNaN(self.number());
alert("Error");
return true;
}

Я проверил ввод как:


    А
    а
    asdsfdsfs
    1

для всех из них isNaN(self.number()) returns false


Что может вызвать эту ошибку?


@Update:
Я проверил с помощью console.log(self.number())
для ввода букв возвращается пустая строка. Итак, почему isNaN возвращает false вместо true?

спросил(а) 2014-04-03T09:58:00+04:00 5 лет, 8 месяцев назад
1
Решение
63

Поскольку ваш input имеет тип number, любое значение, которое не является числовым, будет интерпретироваться как пустая строка.


Итак, вы получите пустую строку и затем передаете ее в isNaN. Что происходит тогда? См. isNaN в спецификации:


    Если ToNumber (число) - NaN, верните true. В противном случае верните false.

Итак, "ToNumber" вызывается с пустой строкой. Пустая строка привязывается к 0, когда к ней применяется операция "ToNumber", а 0 - не NaN. См. ToNumber, примененный к типу строки в спецификации:


MV строки StringNumericLiteral: [empty] равно 0.


ответил(а) 2014-04-03T10:02:00+04:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема