Ответ 1
Когда функция JavaScript возвращает NaN
, это не литеральная строка, а свойство объекта в глобальном пространстве. Вы не можете сравнить его со строкой "NaN"
.
См. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
parseFloat("NaN")
возвращает "NaN", но
parseFloat("NaN") == "NaN"
возвращает false. Теперь, вероятно, хорошо, что он возвращает false, но я не понимаю, как это происходит. Создатели JavaScript просто сделали это особым случаем? Потому что иначе я не могу понять, как это возвращает false.
Когда функция JavaScript возвращает NaN
, это не литеральная строка, а свойство объекта в глобальном пространстве. Вы не можете сравнить его со строкой "NaN"
.
См. https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN
Это особый случай, NaN - единственное, что в Javascript не равно самому себе.
Хотя другие ответы о строках и объекте NaN тоже верны.
Обновление 2
Новым для ECMAScript 6 является функция Object.is(). Это предназначено для дальнейшего улучшения проверки ===
. Одним из преимуществ этой новой функции является то, что Object.is(NaN, NaN)
теперь вернет true. Если вы можете использовать ECMAScript 6, то это будет наиболее читаемым и последовательным решением для вас.
Оригинал
Правильный способ проверить это:
isNaN(parseInt(variable))
Если все, что вы проверяете, является NaN, эта функция вернет true. Этот метод встроен в спецификацию JavaScript.
Использование jQuery
jQuery, встроенный в свою собственную функцию isNaN
изначально, чтобы помочь противостоять некоторым расхождениям между браузерами и добавить дополнительные проверки, чтобы их версия могла использоваться вместо той, что была в VanillaJS.
Обновление для jQuery
После jQuery 1.7 они изменили эту функцию на $.isNumeric()
.
Если вы посмотрите на этот вопрос о переполнении стека, вы найдете много раз, когда isNaN()
возвращает то, что было бы интуитивно считаться "неправильным" ответом, но верно по спецификации.
Одна из главных причин избежать ваниль isNaN()
заключается в том, что null
вернет false
, заставив вас подумать, что это число. Однако функция jQuery охватывает гораздо больший диапазон интуитивных результатов.
Из их документации:
Как и jQuery 3.0 $.isNumeric() возвращает true, только если аргумент имеет значение типа, или если это строка типа, и она может быть принудительно введена в конечные числа. Во всех остальных случаях он возвращает false.
NaN
является одним из немногих примеров объекта, который не равен самому себе. Фактически это свойство используется для реализации общего метода bool IsNaN(number)
:
function isNaN(x)
{
return x != x;
}
Number
(возвращается ParseFloat) сравнивается с string
string
, преобразованным в Number
NaN
не равно любому другому объекту (включая NaN
)Вы получаете NaN==NaN
. Это второе правило неверно.
isNaN
работает для всех значений, которые не являются номерами
isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true
Если, однако, вы хотите специально проверить NaN
или избежать принуждения типа, вы можете использовать Number.isNaN
вместо
Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false
В ECMAScript 6 Object.is() является улучшением ===. Этот метод принимает два аргумента и возвращает true, если значения эквивалентны. И эти два значения считаются эквивалентными, если они одного типа и имеют одинаковое значение. Причина в том, что console.log(Object.is(NaN, NaN)) → TRUE
Я работаю с Google Apps Script, и поэтому я застрял в ECMA 5. Как и в случае с Electric Coffee, вот что я смог выяснить, что, похоже, дает верный ответ о том, значение действительно NaN
, а не если значение NaN
, но если оно фактически NaN
:
function isThisNaN(x)
{
return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]';
}
console.log(isThisNaN(NaN)); // true
lol Просто смешно, что Object.prototype.toString.call(NaN)
равно '[object Number]'
. Мой мозг новичка говорит мне, что NaN
- "Не номер", но, к сожалению, это просто не так просто.
EDIT: Думаю, я должен был сказать, как я оказался в этой статье. Я пошел с идеей, что, конечно, строка, которая не содержит числа, не будет рассматриваться как число... ну, я в конечном итоге выяснил это:
isNaN('a'); // true
isNaN(' '); // false
так что даже если ' '
- это нечисловая строка, она, по-видимому, укорачивается в число (0
).
console.log(Number(' ')); // 0.0
Однако...
console.log( 0 ? true : false); // false
console.log(' ' ? true : false); // true
После прочтения больше я понимаю это немного лучше, но ничего себе, что ментальный crapstorm для новичка lol