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

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

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

Спасибо!

Ответы [ 22 ]

1 голос
/ 26 октября 2010

Я предлагаю вам использовать следующую функцию, если вы действительно хотите правильно проверить, является ли она целым числом:

function isInteger(s)
{
   return Math.ceil(s) == Math.floor(s);
}
1 голос
/ 29 апреля 2015

То, что isNaN(" ") является ложным, является частью сбивающего с толку поведения глобальной функции isNaN из-за приведения не чисел к числовому типу.

От MDN :

Начиная с самых ранних версий спецификации функции isNaN, ее поведение для нечисловых аргументов сбивает с толку. Когда аргумент функции isNaN не имеет типа Number, значение сначала приводится к Number. Полученное значение затем проверяется, чтобы определить, является ли оно NaN. Таким образом, для ненулевых чисел, которые при приведении к числовому типу приводят к допустимому числовому значению, отличному от NaN (в частности, к пустой строке и логическим примитивам, которые при приведении дают числовые значения ноль или единицу), возвращаемое значение «ложь» может быть неожиданным; например, пустая строка, безусловно, «не число».

Также обратите внимание, что в ECMAScript 6 теперь есть также метод Number.isNaN, который согласно MDN:

По сравнению с глобальной функцией isNaN(), Number.isNaN() не сталкивается с проблемой принудительного преобразования параметра в число. Это означает, что теперь безопасно передавать значения, которые обычно конвертируются в NaN, но на самом деле не совпадают с NaN. Это также означает, что только значения типа номера, которые также являются NaN, возвращают true.

К сожалению

Даже у метода ECMAScript 6 Number.isNaN есть свои проблемы, как указано в сообщении в блоге - Исправление уродливой проблемы JavaScript и ES6 NaN .

1 голос
/ 28 августа 2017

Как объяснили другие, функция isNaN преобразует пустую строку в число перед ее проверкой, таким образом изменяя пустую строку на 0 (что является допустимым числом). Однако я обнаружил, что функция parseInt вернет NaN при попытке проанализировать пустую строку или строку только с пробелами. Таким образом, следующая комбинация работает хорошо:

if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');

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

0 голосов
/ 13 августа 2018

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

// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }

0 голосов
/ 08 августа 2018

NaN! == "не число"

NaN - это значение типа номера

это определение isNaN () в ECMAScript

1. Let num be ToNumber(number).
2. ReturnIfAbrupt(num).
3. If num is NaN, return true.
4. Otherwise, return false.

Попробуйте преобразовать любое значение в число.

Number(" ") // 0
Number("x") // NaN
Number(null) // 0

Если вы хотите определить, является ли значение NaN, попробуйте сначала преобразовать его в числовое значение.

0 голосов
/ 27 октября 2017

Я использую это

    function isNotANumeric(val) {
    	if(val.trim && val.trim() == "") {
         return true;
      } else {
      	 return isNaN(parseFloat(val * 1));
      }
    }
    
    alert(isNotANumeric("100"));  // false
    alert(isNotANumeric("1a"));   // true
    alert(isNotANumeric(""));     // true
    alert(isNotANumeric("   "));  // true
0 голосов
/ 12 апреля 2017

isNAN(<argument>) - это функция, которая сообщает, является ли данный аргумент недопустимым числом. isNaN typecasts аргументы в числовой тип. Если вы хотите проверить, является ли аргумент числовым или нет? Пожалуйста, используйте функцию $.isNumeric() в jQuery.

То есть isNaN (foo) эквивалентно isNaN (Number (foo)) Любые строки, имеющие все цифры, принимаются по понятным причинам. Например,

isNaN(123) //false
isNaN(-1.23) //false
isNaN(5-2) //false
isNaN(0) //false
isNaN('123') //false
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN('') //false
isNaN(true) //false
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
0 голосов
/ 08 января 2017

Функция JavaScript isNaN является, как и следовало ожидать по умолчанию, «оператором динамического типа». Поэтому все значения, которые (во время процесса DTC) могут дать простую истину | false, например "", " ", " 000", не может быть NaN.

Это означает, что указанный аргумент сначала будет подвергнут преобразованию , как в:

function isNaNDemo(arg){
   var x = new Number(arg).valueOf();
   return x != x;
}

Пояснение:

В верхней строке тела функции мы (сначала) пытаемся успешно преобразовать аргумент в числовой объект. И (во-вторых), используя оператор точки, мы - для нашего собственного удобства - немедленно удаляем примитив значение созданного объекта.

Во второй строке мы берем значение, полученное на предыдущем шаге, и преимущество того факта, что NaN не равно ничему во вселенной, даже например, NaN == NaN >> false чтобы окончательно сравнить его (для неравенства) с самим собой.

Таким образом, функция return выдаст true только тогда и только тогда, когда предоставленный аргумент-возврат является неудачной попыткой преобразования в числовой объект, т. Е. не числовой номер; например, NaN.


isNaNstatic ()

Однако для оператора статического типа - при необходимости и при необходимости - мы можем написать гораздо более простую функцию, например:

function isNaNstatic(x){   
   return x != x;
}

И вообще избегайте DTC, чтобы, если аргумент не был явным числом NaN, он возвращал бы false. А потому тестирование на следующее:

isNaNStatic(" x"); // will return false потому что это все еще строка.

Тем не менее: isNaNStatic(1/"x"); // will of course return true. как будет, например isNaNStatic(NaN); >> true.

Но вопреки isNaN, isNaNStatic("NaN"); >> false, потому что это (аргумент) обычная строка.

p.s .: Статическая версия isNaN может быть очень полезна в современных сценариях кодирования. И это вполне может быть одной из главных причин, почему я нашел время для публикации этого.

Привет.

0 голосов
/ 03 февраля 2012

Эта функция, кажется, работала в моих тестах

function isNumber(s) {
    if (s === "" || s === null) {
        return false;
    } else {
        var number = parseInt(s);
        if (number == 'NaN') {
            return false;
        } else {
            return true;
        }
    }
}
0 голосов
/ 14 декабря 2015

Я написал эту быструю небольшую функцию, чтобы помочь решить эту проблему.

function isNumber(val) {
     return (val != undefined && val != null && val.toString().length > 0 && val.toString().match(/[^0-9\.\-]/g) == null);
};

Он просто проверяет наличие любых символов, которые не являются числовыми (0-9), не являются '-' или '.', И которые не являются неопределенными, нулевыми или пустыми, и возвращает true, если совпадений нет. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...