Я только пробовал его в консоли JavaScript Firefox, но ни одно из следующих утверждений не возвращает true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
Я только пробовал его в консоли JavaScript Firefox, но ни одно из следующих утверждений не возвращает true:
parseFloat('geoff') == NaN;
parseFloat('geoff') == Number.NaN;
Попробуйте этот код:
isNaN(parseFloat("geoff"))
Для проверки, есть ли какое-либо значение NaN, а не просто числа, см. здесь: Как вы проверяете NaN в Javascript?
Я только что столкнулся с этой техникой в книге Эффективный JavaScript, которая довольно проста:
Поскольку NaN является единственным значением JavaScript, которое рассматривается как неравное для себя, вы всегда можете проверить, является ли значение NaN, проверив его на равенство с самим собой:
var a = NaN;
a !== a; // true
var b = "foo";
b !== b; // false
var c = undefined;
c !== c; // false
var d = {};
d !== d; // false
var e = { valueOf: "foo" };
e !== e; // false
Не осознавал этого, пока @allsyed не прокомментировал, но это в спецификации ECMA: https://tc39.github.io/ecma262/#sec-isnan-number
Используйте этот код:
isNaN('geoff');
Смотрите isNaN()
docs на MDN.
alert ( isNaN('abcd')); // alerts true
alert ( isNaN('2.0')); // alerts false
alert ( isNaN(2.0)); // alerts false
Поскольку значение типа Number должно быть проверено, является ли оно NaN
или нет, глобальная функция isNaN
выполнит эту работу.
isNaN(any-Number);
Для общего подхода, который работает для всех типов в JS, мы можем использовать любое из следующего:
Для пользователей ECMAScript-5:
#1
if(x !== x) {
console.info('x is NaN.');
}
else {
console.info('x is NOT a NaN.');
}
Для людей, использующих ECMAScript-6:
#2
Number.isNaN(x);
И в целях обеспечения согласованности в ECMAScript 5 и 6, мы также можем использовать этот polyfill для Number.isNan
#3
//Polyfill from MDN
Number.isNaN = Number.isNaN || function(value) {
return typeof value === "number" && isNaN(value);
}
// Or
Number.isNaN = Number.isNaN || function(value) {
return value !== value;
}
пожалуйста, проверьте этот ответ для более подробной информации.
NaN - особое значение, которое невозможно проверить таким образом. Интересная вещь, которую я просто хотел поделиться, это
var nanValue = NaN;
if(nanValue !== nanValue) // Returns true!
alert('nanValue is NaN');
Это возвращает true только для значений NaN и является безопасным способом тестирования. Должно быть обязательно завернуто в функцию или, по крайней мере, прокомментировано, потому что не имеет смысла явно проверять, не совпадает ли одна и та же переменная, хе-хе.
Вы должны использовать глобальный вызов функции isNaN(value)
, потому что:
Примеры:
isNaN('geoff'); // true
isNaN('3'); // false
Надеюсь, это поможет вам.
Как и в ES6, Object.is(..)
- это новая утилита, которая может использоваться для проверки двух значений для абсолютного равенства:
var a = 3 / 'bar';
Object.is(a, NaN); // true
Чтобы решить проблему, когда '1.2geoff'
анализируется, просто используйте вместо этого анализатор Number()
.
Итак, а не это:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
Сделай это:
Number('1.2geoff'); // => NaN
isNaN(Number('1.2geoff')); // => true
isNaN(Number('.2geoff')); // => true
isNaN(Number('geoff')); // => true
РЕДАКТИРОВАТЬ: я только что заметил еще одну проблему из этого, хотя... ложные значения (и истина как реальное логическое значение), переданные в Number()
возвращаются как 0
! В этом случае... parseFloat работает каждый раз вместо этого. Итак, вернемся к этому:
function definitelyNaN (val) {
return isNaN(val && val !== true ? Number(val) : parseFloat(val));
}
И это охватывает, казалось бы, все. Я тестировал его на 90% медленнее, чем lodash _.isNaN
но тогда он не охватывает все NaN:
http://jsperf.com/own-isnan-vs-underscore-lodash-isnan
Просто чтобы прояснить, моя заботится о человеческой буквальной интерпретации чего-то, что является "не числом", а lodash заботится о компьютерной буквальной интерпретации проверки, является ли что-то "NaN".
В то время как ответ @chiborg правильный, есть еще что-то, что следует отметить:
parseFloat('1.2geoff'); // => 1.2
isNaN(parseFloat('1.2geoff')); // => false
isNaN(parseFloat('.2geoff')); // => false
isNaN(parseFloat('geoff')); // => true
Точка, если вы используете этот метод для проверки ввода, результат будет довольно либеральным.
Итак, да, вы можете использовать parseFloat(string)
(или в случае полных чисел parseInt(string, radix)
', а затем обернуть это с помощью isNaN()
, но помните о полученной информации с номерами, переплетенными с дополнительными нечисловыми символами.
ДЕЙСТВИТЕЛЬНО супер просто! Вот! Имейте этот метод!
function isReallyNaN(a) { return a !== a; };
Использовать так же просто, как:
if (!isReallyNaN(value)) { return doingStuff; }
См. тест производительности here, используя этот func vs selected answer
Также: см. ниже 1-й пример для нескольких альтернативных реализаций.
function isReallyNaN(a) { return a !== a; };
var example = {
'NaN': NaN,
'an empty Objet': {},
'a parse to NaN': parseFloat('$5.32'),
'a non-empty Objet': { a: 1, b: 2 },
'an empty Array': [],
'a semi-passed parse': parseInt('5a5'),
'a non-empty Array': [ 'a', 'b', 'c' ],
'Math to NaN': Math.log(-1),
'an undefined object': undefined
}
for (x in example) {
var answer = isReallyNaN(example[x]),
strAnswer = answer.toString();
$("table").append($("<tr />", { "class": strAnswer }).append($("<th />", {
html: x
}), $("<td />", {
html: strAnswer
})))
};
table { border-collapse: collapse; }
th, td { border: 1px solid; padding: 2px 5px; }
.true { color: red; }
.false { color: green; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<table></table>
Если ваша среда поддерживает ECMAScript 2015, то вы можете использовать Number.isNaN
чтобы убедиться, что значение действительно NaN
.
Проблема с isNaN
заключается в том, что, если вы используете это с нечисловыми данными, применяется несколько непонятных правил (согласно MDN). Например,
isNaN(NaN); // true
isNaN(undefined); // true
isNaN({}); // true
Итак, в средах, поддерживаемых ECMA Script 2015, вы можете использовать
Number.isNaN(parseFloat('geoff'))
Я использую функцию underscore isNaN
, потому что в JavaScript:
isNaN(undefined)
-> true
По крайней мере, помните о том, что было получено.
NaN в JavaScript означает "Not A Number", хотя его тип фактически является номером.
typeof(NaN) // "number"
Чтобы проверить, имеет ли переменная значение NaN, мы не можем просто использовать функцию isNaN(), потому что isNaN() имеет следующую проблему, см. ниже:
var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN
Что действительно происходит, так это то, что myVar неявно принуждается к числу:
var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact
Это действительно имеет смысл, потому что "А" на самом деле не является числом. Но мы действительно хотим проверить, действительно ли myVar имеет значение NaN.
Так isNaN() не может помочь. Тогда что мы должны делать вместо этого?
В свете того, что NaN является единственным значением JavaScript, которое обрабатывается неравномерно, поэтому мы можем проверить его равенство для себя, используя! ==
var myVar; // undefined
myVar !== myVar // false
var myVar = "A";
myVar !== myVar // false
var myVar = NaN
myVar !== myVar // true
Итак, чтобы заключить, если это правда, что сама переменная! ==, то эта переменная имеет точно значение NaN:
function isOfValueNaN(v) {
return v !== v;
}
var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
Кажется, что isNaN() не поддерживается в Node.js из коробки.
Я работал с
var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
Я просто хочу поделиться другой альтернативой, это не обязательно лучше, чем другие, но я думаю, стоит посмотреть:
function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }
Логика заключается в том, что каждое число, кроме 0
и NaN
, добавляется к true
.
Я сделал быстрый тест, и он работает так же хорошо, как Number.isNaN
и как проверка на себя для false. Все три выполняют лучше, чем isNan
Результаты
customIsNaN(NaN); // true
customIsNaN(0/0); // true
customIsNaN(+new Date('?')); // true
customIsNaN(0); // false
customIsNaN(false); // false
customIsNaN(null); // false
customIsNaN(undefined); // false
customIsNaN({}); // false
customIsNaN(''); // false
Может стать полезным, если вы хотите избежать сломанной функции isNan
.
function isNotANumber(n) {
if (typeof n !== 'number') {
return true;
}
return n !== n;
}
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
Оператор равенства (== и ===) не может использоваться для проверки значения против NaN.
Посмотрите Документация Mozilla Глобальное свойство NaN представляет собой значение, представляющее Not-A-Numbe
Лучший способ - использовать 'isNaN()', который является функцией buit-in для проверки NaN. Все браузеры поддерживают способ.
Точный способ проверки:
//takes care of boolen, undefined and empty
isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
Возможно также это:
function isNaNCustom(value){
return value.toString() === 'NaN' &&
typeof value !== 'string' &&
typeof value === 'number'
}
Согласно IEEE 754, все отношения, связанные с NaN, оцениваются как false, кроме! =. Таким образом, например, (A >= B) = false и (A <= B) = false, если A или B или оба являются NaN.
Я написал этот ответ на другой вопрос fooobar.com/questions/24725/..., где другой проверяет, когда NaN == null
, но затем он был помечен как дубликат, поэтому я не хочу тратить моя работа.
Посмотрите Сеть разработчиков Mozilla около NaN
.
Просто используйте distance || 0
, когда вы хотите убедиться, что вы используете правильное число или isNaN()
, чтобы проверить его.
NaN (Not-a-Number) - глобальный объект Weirdo в javascript, который часто возвращается, когда некоторая математическая операция не удалась.
Вы хотите проверить, если NaN == null
результат false
. Hovewer даже NaN == NaN
приводит к false
.
Простой способ узнать, является ли переменная NaN
глобальной функцией isNaN()
.
Другим является x !== x
, что справедливо только тогда, когда x является NaN. (спасибо, чтобы напомнить @raphael-schweikert)
Выясните.
Когда вы вызываете NaN == false
, результат равен false
, то же самое с NaN == true
.
Где-то в спецификациях JavaScript имеет запись с всегда ложными значениями, которая включает в себя:
NaN
- Не-номер""
- пустая строкаfalse
- логическое значение falsenull
- нулевой объектundefined
- undefined переменные0
- числовое число 0, включая +0 и -0Другое решение упоминается в странице MDN parseFloat
Он предоставляет функцию фильтра для строгой разборки
var filterFloat = function (value) {
if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
.test(value))
return Number(value);
return NaN;
}
console.log(filterFloat('421')); // 421
console.log(filterFloat('-421')); // -421
console.log(filterFloat('+421')); // 421
console.log(filterFloat('Infinity')); // Infinity
console.log(filterFloat('1.61803398875')); // 1.61803398875
console.log(filterFloat('421e+0')); // NaN
console.log(filterFloat('421hop')); // NaN
console.log(filterFloat('hop1.61803398875')); // NaN
И затем вы можете использовать isNaN
, чтобы проверить, есть ли это NaN
Я создал эту небольшую функцию, которая работает как шарм. Вместо проверки на NaN, который, кажется, встречный интуитивный, вы проверяете число. Я уверен, что я не первый, кто сделал это таким образом, но я думал, что хочу поделиться.
function isNum(val){
var absVal = Math.abs(val);
var retval = false;
if((absVal-absVal) == 0){
retval = true
}
return retval;
}
Нашел другой способ, просто для удовольствия.
function IsActuallyNaN(obj) {
return [obj].includes(NaN);
}
Ответ marksyzm работает хорошо, но он не возвращает false для Infinity
, поскольку Infinity технически не является числом.
i появилась функция isNumber
, которая будет проверять, является ли это числом.
function isNumber(i) {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].indexOf(i) === -1;
}
console.log(isNumber(Infinity));
console.log(isNumber("asdf"));
console.log(isNumber(1.4));
console.log(isNumber(NaN));
console.log(isNumber(Number.MAX_VALUE));
console.log(isNumber("1.68"));
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);
Это не изящно. но после попытки isNAN() я пришел к этому решению, что является другой альтернативой. В этом примере я также разрешил '.' потому что я маскирую для float. Вы также можете отменить это, чтобы убедиться, что номера не используются.
("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)
Это оценка одного символа, но вы также можете прокручивать строку для проверки любых чисел.
Является (NaN >= 0)?...... " Я не знаю".
function IsNotNumber( i ){
if( i >= 0 ){ return false; }
if( i <= 0 ){ return false; }
return true;
}
Условия выполняются только в том случае, если ИСТИНА.
Не на ЛОЖЬ.
Не на " Я не знаю".
Правило таково:
NaN != NaN
Проблема функции isNaN() в том, что она может возвращать неожиданный результат в некоторых случаях:
isNaN('Hello') //true
isNaN('2005/12/12') //true
isNaN(undefined) //true
isNaN('NaN') //true
isNaN(NaN) //true
isNaN(0 / 0) //true
Лучший способ проверить, действительно ли значение NaN:
function is_nan(value) {
return value != value
}
is_nan(parseFloat("geoff"))
Просто преобразуйте результат в String и сравните с "NaN".
var val = Number("test");
if(String(val) === 'NaN') {
console.log("true");
}
if(isNaN("I am NotaNumber (NaN)") == true) {
console.log("Not a Number")
}
if(isNaN(1) == false) {
console.log("I am a number")
}