В JavaScript почему isNaN(" ")
оценивать false
, но isNaN(" x")
оценивать true
?
Я выполнение численных операций на поле ввода текста, и я проверяю , если поле null
, ""
или NaN
. Когда кто-то вводит в поле несколько пробелов, моя проверка не выполняется на всех трех, и я не понимаю, почему он прошел isNaN
проверку.
javascript
nan
IVR Avenger
источник
источник
"" == false // true
иisNaN(" ") // false
Ответы:
JavaScript интерпретирует пустую строку как 0, что затем не проходит тест isNAN. Сначала вы можете использовать parseInt для строки, которая не будет преобразовывать пустую строку в 0. Затем результат должен завершиться ошибкой isNAN.
источник
isNaN(arg)
. 1) Конвертировать arg в число, 2) Проверить, является ли это число числовым значениемNaN
. Это помогло мне понять это лучше.Это может показаться удивительным, а может и нет, но вот тестовый код, который покажет вам причудливость движка JavaScript.
так что это означает, что
и
но
Радоваться, веселиться :)
источник
null
,""
и" "
я сам. Спасибо!Чтобы лучше это понять, откройте PDF-файл спецификации Ecma-Script на странице 43 «ToNumber, примененный к строковому типу»
если строка имеет числовой синтаксис, который может содержать любое количество символов пробела, ее можно преобразовать в тип Number. Пустая строка оценивается как 0. Также строка «Бесконечность» должна дать
источник
Попробуйте использовать:
Или
источник
От
MDN
причины проблемы, с которой вы столкнулисьВы можете проверить следующий исчерпывающий ответ, который также охватывает сравнение NaN на равенство.
источник
Я думаю, что это из-за типизации Javascript:
' '
конвертируется в ноль, а'x'
не:источник
Если вы хотите реализовать точную функцию isNumber, вот один из способов сделать это из Javascript: The Good Parts by Douglas Crockford [страница 105]
источник
Не совсем правильный ответ
Высоко проголосованный и принятый ответ Антонио Хейли делает неправильное предположение, что этот процесс проходит через функцию JavaScript
parseInt
:Мы можем легко опровергнуть это утверждение строкой
"123abc"
:При этом мы можем видеть, что
parseInt
функция JavaScript возвращается"123abc"
как число123
, но егоisNaN
функция сообщает нам, что"123abc"
это не число.Правильный ответ
ECMAScript-262 определяет, как
isNaN
работает проверка в разделе 18.2.3 .В
ToNumber
ссылках функции она определена в ECMAScript-262 в разделе 7.1.3 . Здесь нам рассказывают, как JavaScript обрабатывает строки, которые передаются этой функции.Первый пример, приведенный в вопросе, представляет собой строку, содержащую только пробельные символы. В этом разделе говорится, что:
Таким образом,
" "
строка примера преобразуется в+0
число.В том же разделе также говорится:
Без цитирования всех проверок, содержащихся в этом разделе,
" x"
приведенный в вопросе пример попадает в вышеуказанное условие, поскольку его нельзя интерпретировать как aStringNumericLiteral
." x"
поэтому преобразуется вNaN
.источник
Я не уверен почему , но чтобы обойти проблему, вы всегда можете обрезать пробелы перед проверкой. Вы, вероятно, хотите сделать это в любом случае.
источник
Функция
isNaN("")
выполняет строку на номер типа принужденияECMAScript 3-5 определяет следующие возвращаемые значения для оператора typeof:
Лучше обернуть наш тест в функциональное тело:
Эта функция не предназначена для проверки типа переменной , вместо этого она проверяет приведенное значение . Например, логические значения и строки приводятся к числам, поэтому, возможно, вы захотите вызвать эту функцию как
isNumberCoerced()
если нет необходимости проверять типы, отличные от строки и числа , то следующий фрагмент может быть использован как часть некоторого условия:
источник
Я предлагаю вам использовать следующую функцию, если вы действительно хотите правильно проверить, является ли она целым числом:
источник
То,
isNaN(" ")
что ложно, является частью запутанного поведенияisNaN
глобальной функции из-за приведения ее не чисел к числовому типу.От MDN :
Также обратите внимание, что в ECMAScript 6 теперь есть
Number.isNaN
метод, который согласно MDN:К сожалению :
Даже у
Number.isNaN
метода ECMAScript 6 есть свои проблемы, как об этом говорится в сообщении в блоге - Исправление уродливой проблемы JavaScript и ES6 NaN .источник
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-9), не являются '-' или '.', И которые не являются неопределенными, нулевыми или пустыми, и возвращает true, если совпадений нет. :)
источник
Как было объяснено другим,
isNaN
функция будет приводить пустую строку к числу перед проверкой, тем самым изменяя пустую строку на 0 (что является допустимым числом). Однако я обнаружил, чтоparseInt
функция будет возвращатьсяNaN
при попытке проанализировать пустую строку или строку только с пробелами. Таким образом, следующая комбинация работает хорошо:if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');
Эта проверка будет работать для положительных чисел, отрицательных чисел и чисел с десятичной точкой, поэтому я считаю, что она охватывает все распространенные числовые случаи.
источник
NaN
! == "не число"NaN
это значение типа номераэто определение isNaN () в ECMAScript
Попробуйте преобразовать любое значение в число.
Если вы хотите определить, является ли это значение
NaN
, вы должны сначала попытаться преобразовать его в числовое значение.источник
Эта функция, казалось, работала в моих тестах
источник
return !(s === "" || s === null || parseInt(s) == 'NaN');
Что о
источник
JavaScript встроенный в IsNaN функции, это - как и следовало ожидать , по умолчанию - это «Динамический тип оператора». Поэтому все значения, которые (во время процесса DTC) могут дать простую истину | ложь, например
"", " ", " 000"
, не может быть NaN.Это означает, что переданный аргумент сначала будет преобразован, как в:
Объяснение:
В верхней строке тела функции мы (сначала) пытаемся успешно преобразовать аргумент в числовой объект. И (второй), с помощью оператора точки мы - для собственного удобства - сразу вырежешь, на примитивное значение создаваемого объекта.
Во второй строке мы берем значение, полученное на предыдущем шаге, и преимущество того факта, что NaN не равен чему-либо во вселенной, даже самому себе, например:
NaN == NaN >> false
чтобы окончательно сравнить его (для неравенства) с самим собой ,Таким образом, функция return выдаст true только тогда и только тогда, когда предоставленный аргумент return является неудачной попыткой преобразования в числовой объект, т. Е. В число, не являющееся числом; например, NaN.
isNaNstatic ()
Однако для оператора статического типа - при необходимости и при необходимости - мы можем написать гораздо более простую функцию, такую как:
И вообще избегайте DTC, чтобы, если аргумент не был явным числом NaN, он вернул бы false. А потому тестирование на следующее:
isNaNStatic(" x"); // will return false
потому что это все еще строка.Однако:
isNaNStatic(1/"x"); // will of course return true.
как будет, напримерisNaNStatic(NaN); >> true
.Но вопреки тому
isNaN
,isNaNStatic("NaN"); >> false
потому что это (аргумент) является обычной строкой.PS: статическая версия isNaN может быть очень полезна в современных сценариях кодирования. И это вполне может быть одной из основных причин, почему я нашел время для публикации этого.
С уважением.
источник
isNAN(<argument>)
это функция для определения, является ли данный аргумент недопустимым числомisNaN
Typecasts аргументы в числовой тип. Если вы хотите проверить, является ли аргумент числовым или нет? Пожалуйста, используйте$.isNumeric()
функцию в JQuery.Таким образом, isNaN (foo) эквивалентно isNaN (Number (foo)). Он принимает любые строки, имеющие все цифры, в качестве чисел по очевидным причинам. Например
источник
Я использую это
источник
При проверке, если определенное строковое значение с пробелами или
" "
,isNaN
возможно, попытаться выполнить проверку строки, например:// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }
источник