NaN
Глобальное свойство NaN
— это значение, представляющее Not-A-Number.
Атрибуты свойства NaN
|
|
---|---|
Writable | no |
Enumerable | no |
Configurable | no |
Try it
Description
NaN
— это свойство глобального объекта . Другими словами, это переменная в глобальной области видимости.
Начальное значение NaN
равно Not-A-Number — то же, что и значение Number.NaN
. В современных браузерах NaN
является ненастраиваемым и недоступным для записи свойством. Даже если это не так, избегайте переопределения. NaN
в программе довольно редко .
Существует пять различных типов операций, возвращающих NaN
:
- Число не может быть проанализировано (например,
parseInt("blabla")
илиNumber(undefined)
) - Математическая операция, результат которой не является действительным числом (например,
Math.sqrt(-1)
) - Операнд аргумента —
NaN
(например,7 ** NaN
) - Неопределенная форма (например,
0 * Infinity
илиundefined + undefined
) - Любая операция, которая включает строку и не является операцией сложения (например,
"foo" / 3
)
Examples
Тестирование против NaN
NaN
сравнивает unequal (через ==
, !=
, ===
и !==
) с любым другим значением, в том числе с другим значением NaN
. Используйте Number.isNaN()
или isNaN()
, чтобы наиболее четко определить, является ли значение NaN
. Или выполните самосравнение: NaN
и только NaN
будут сравниваться неравно самому себе.
NaN === NaN; Number.NaN === NaN; isNaN(NaN); isNaN(Number.NaN); Number.isNaN(NaN); function valueIsNaN(v) { return v !== v; } valueIsNaN(1); valueIsNaN(NaN); valueIsNaN(Number.NaN);
Однако обратите внимание на разницу между isNaN()
и Number.isNaN()
: первый вернет true
если значение в настоящее время равно NaN
, или если оно будет NaN
после приведения его к числу, а последнее вернет true
только если значение в настоящее время NaN
:
isNaN('hello world'); Number.isNaN('hello world');
По той же причине использование значения bigint
вызовет ошибку с isNaN()
, а не с Number.isNaN()
:
isNaN(1n); Number.isNaN(1n);
Кроме того, некоторые методы массива не могут найти NaN
, а другие -.
const arr = [2, 4, NaN, 12]; arr.indexOf(NaN); arr.includes(NaN); arr.findIndex((n) => Number.isNaN(n));
Specifications
Browser compatibility
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | Deno | Node.js | |
NaN |
1 |
12 |
1 |
4 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
See also
Number.NaN
Number.isNaN()
isNaN()
JavaScript
-
Math.tanh()
Функция Math.tanh()возвращает гиперболический тангенс числа,то есть tanh x sinh cosh e 2 1 frac{sinh x}{cosh {e^x frac{e^{2x}1}{e^{2x}+1}Число.
-
Math.trunc()
Функция Math.trunc()возвращает целую часть числа,удаляя все дробные цифры.
-
Number
Number-это примитивный объект-обертка,используемый для представления и манипулирования числами,такими как 37 -9.25.
-
Number.EPSILON
Свойство Number.EPSILON представляет разницу между 1 и наименьшим значением с плавающей точкой больше чем Вы не должны создавать объект Number для доступа к этому свойству.
От автора: В данной статье мы познакомимся со специальным свойством NaN (Not-A-Number), которое является значением, представляющим не-число.
Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:
const integer = 4; const float = 1.5; typeof integer; // => ‘number’ typeof float; // => ‘number’ |
Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
const infinite = Infinity; const faulty = NaN; typeof infinite; // => ‘number’ typeof faulty; // => ‘number’ |
Хотя непосредственная работа с NaN редко встречается, оно может неожиданно появиться после неудачной операции с числами.
Давайте подробно рассмотрим специальное значение NaN: как проверить, содержит ли переменная NaN, и сценарии, которые в которых генерируется значения «не число».
1. Число NaN
Тип числа в JavaScript — это набор всех числовых значений, включая «не число», положительную бесконечность и отрицательную бесконечность.
«Not A Number» можно получить с помощью специального выражения NaN или как свойство глобального объекта или функции Number:
typeof NaN; // => ‘number’ typeof window.NaN; // => ‘number’ typeof Number.NaN; // => ‘number’ |
«Не число» — это значение, которое не представляет действительное число, несмотря на то, что оно имеет тип числа. Через NaN полезно представлять ошибочные операции с числами. Например, умножение числа на undefined не является допустимой операцией, поэтому дает NaN:
Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:
parseInt(‘Joker’, 10); // => NaN |
2. Проверка на равенство с NaN
Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:
Это поведение полезно для определения, является ли переменная NaN:
const someNumber = NaN; if (someNumber !== someNumber) { console.log(‘Is NaN’); } else { console.log(‘Is Not NaN’); } // logs «Is NaN» |
Выражение someNumber !== someNumber равно true, только если someNumber является NaN. Таким образом, приведенный выше фрагмент регистрирует в консоли «Is NaN». JavaScript содержит встроенные функции для определения NaN: isNaN() и Number.isNaN():
isNaN(NaN); // => true isNaN(1); // => false Number.isNaN(NaN); // => true Number.isNaN(1); // => false |
Разница между этими функциями заключается в том, что Number.isNaN() не преобразуется свой аргумент в число:
isNaN(‘Joker12’); // => true Number.isNaN(‘Joker12’); // => false |
isNaN(‘Joker12’) преобразует аргумент ‘Joker12’ в число, которое является NaN. Таким образом, функция возвращает true.
С другой стороны, Number.isNaN(‘Joker12’) проверяет аргумент без преобразования. Функция возвращает false, потому ‘Joker12’ не равно NaN.
3. Операции, дающие NaN
3.1 Парсинг чисел
В JavaScript вы можете преобразовать числовые строки в числа. Например, вы можете легко преобразовать строку ‘1.5’ в число с плавающей запятой 1.5:
const numberString = ‘1.5’; const number = parseFloat(numberString); number; // => 1.5 |
Когда строка не может быть преобразована в число, функция синтаксического анализа возвращает NaN: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
parseFloat(‘Joker12.5’); // => NaN parseInt(‘Joker12’, 10); // => NaN Number(‘Joker12’); // => NaN |
При парсинге чисел рекомендуется проверить, не является ли результат парсинга NaN:
let inputToParse = ‘Invalid10’; let number; number = parseInt(inputToParse, 10); if (isNaN(number)) { number = 0; } number; // => 0 |
Парсинг inputToParse не удался, поэтому parseInt(inputToParse, 10) возвращается NaN. Условие if (isNaN(number)) оценивается, как true, и 0 назначается number.
3.2 undefined в качестве операнда
При использовании undefined в качестве операнда в арифметических операциях, таких как сложение, умножение и т д. мы получаем NaN. Например:
function getFontSize(style) { return style.fontSize; } const fontSize = getFontSize({ size: 16 }) * 2; const doubledFontSize = fontSize * 2; doubledFontSize; // => NaN |
getFontSize() — это функция, которая обращается к свойству fontSize из объекта стиля. При вызове getFontSize({ size: 16 }) результатом будкт undefined (свойство fontSize не существует в объекте { size: 16 }). fontSize * 2 оценивается как undefined * 2, что дает NaN.
«Not A Number» генерируется, когда в качестве значения в арифметических операциях используется отсутствующее свойство или функция, возвращающая undefined. Отсутствие undefined в арифметических операциях — это хороший способ предотвратить получение NaN.
3.3 NaN как операнд
Значение NaN также генерируется, когда операндом в арифметических операциях является NaN:
1 + NaN; // => NaN 2 * NaN; // => NaN |
NaN распространяется на арифметические операции:
let invalidNumber = 1 * undefined; let result = 1; result += invalidNumber; // appendresult *= 2; // duplicate result++; // increment result; // => NaN |
Операции с переменной result прерываются после добавления к result значения invalidNumber (которое является NaN).
3.4 Неопределенные формы
Значение NaN создается, когда арифметические операции имеют неопределенные формы. Деление 0 / 0 и Inifinity / Infinity:
0 / 0; // => NaN Infinity / Infinity; // => NaN |
Умножение 0 и Infinity:
Сложение бесконечных чисел с разными знаками:
—Infinity + Infinity; // => NaN |
3.5 Неверные аргументы математических функций
Квадратный корень из отрицательного числа:
Math.pow(—2, 0.5); // => NaN (—2) ** 0.5; // => NaN |
Или логарифм отрицательного числа:
4. Заключение
Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).
Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.
Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.
Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»
Автор: Dmitri Pavlutin
Источник: //dmitripavlutin.com
Редакция: Команда webformyself.
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Узнать подробнее
JavaScript. Быстрый старт
Изучите основы JavaScript на практическом примере по созданию веб-приложения
Смотреть
Shekanya 0 / 0 / 0 Регистрация: 09.04.2016 Сообщений: 9 |
||||||||
1 |
||||||||
15.05.2016, 09:37. Показов 9579. Ответов 14 Метки нет (Все метки)
Чтобы не было написано NaN, а к примеру 0.
Извиняюсь, возможно уже тысячекратно объяснялось, но искал с фонариком — гугл выдал «чтобы не было написано NaN» только ссылки где про чекбоксы, из которых ну совсем ничего не понятно:
__________________
0 |
WeMeSder 32 / 31 / 21 Регистрация: 13.07.2014 Сообщений: 374 |
||||
15.05.2016, 10:12 |
2 |
|||
может просто проверить и изменить если NaN:
0 |
Shekanya 0 / 0 / 0 Регистрация: 09.04.2016 Сообщений: 9 |
||||
16.05.2016, 01:24 [ТС] |
3 |
|||
может просто проверить и изменить если NaN:
не работает(
0 |
$ su 1605 / 520 / 97 Регистрация: 18.11.2010 Сообщений: 2,807 Записей в блоге: 2 |
|
16.05.2016, 02:19 |
4 |
не работает( наоборот там стоит знак равенства, неравенство это !=
1 |
sad67man 2031 / 1115 / 566 Регистрация: 23.08.2015 Сообщений: 2,837 |
||||
16.05.2016, 10:14 |
5 |
|||
Сообщение было отмечено Shekanya как решение РешениеNaN == NaN всегда возвращает false. Правильней будет так
1 |
-28 / 12 / 2 Регистрация: 02.12.2015 Сообщений: 620 |
|
16.05.2016, 11:48 |
6 |
hh=hh*1 и value=0 в инпуте не подходит?
0 |
2031 / 1115 / 566 Регистрация: 23.08.2015 Сообщений: 2,837 |
|
16.05.2016, 12:26 |
7 |
НиколайВасильев, NaN*1 вернет NaN
0 |
Философ-разговорник 620 / 320 / 106 Регистрация: 20.02.2016 Сообщений: 754 Записей в блоге: 1 |
|
16.05.2016, 14:16 |
8 |
Я может чего не догоняю, но, если не затруднит уважаемую публику, объясните мне нормально ли иметь две функции с одинаковыми именами и ожидать, что они не переназначат друг друга, а будут работать обе-две?! Если так, то нахрена я всем функциям даю разные названия и вообще даю названия, а не использую анонимные?
0 |
-28 / 12 / 2 Регистрация: 02.12.2015 Сообщений: 620 |
|
16.05.2016, 19:58 |
9 |
NaN*1 вернет NaN после value=0 NaN не будет
0 |
Shekanya 0 / 0 / 0 Регистрация: 09.04.2016 Сообщений: 9 |
||||||||
17.05.2016, 00:44 [ТС] |
10 |
|||||||
NaN == NaN всегда возвращает false. Правильней будет так
Работает! Спасибо! А не могли бы вы еще объяснить, почему в остальных output’ах не выводился NaN, а только в первом?
сделать чтобы и в первом тоже не выводился NaN? Добавлено через 6 минут
hh=hh*1 и value=0 в инпуте не подходит?
НиколайВасильев, NaN*1 вернет NaN Действительно, ведь NaN не может быть равен NaN — https://ru.wikipedia.org/wiki/NaN
Я может чего не догоняю, но, если не затруднит уважаемую публику, объясните мне нормально ли иметь две функции с одинаковыми именами и ожидать, что они не переназначат друг друга, а будут работать обе-две?! Если так, то нахрена я всем функциям даю разные названия и вообще даю названия, а не использую анонимные? Вы об чем?
0 |
2031 / 1115 / 566 Регистрация: 23.08.2015 Сообщений: 2,837 |
|
17.05.2016, 00:50 |
11 |
Shekanya, Если не удается привести строку в число, то получается NaN, что означает «не чмсло», т.е. parseFloat(«») или parseFloat(«abc») вернет NaN. Если NaN умножить на любое число, то вернется тоже NaN. Так же NaN может возникнуть при делении 0/0.
0 |
Shekanya 0 / 0 / 0 Регистрация: 09.04.2016 Сообщений: 9 |
||||||||
17.05.2016, 00:58 [ТС] |
12 |
|||||||
Shekanya, Если не удается привести строку в число, то получается NaN, что означает «не чмсло», т.е. parseFloat(«») или parseFloat(«abc») вернет NaN. Если NaN умножить на любое число, то вернется тоже NaN. Так же NaN может возникнуть при делении 0/0. Ды это понятно, непонятно почему
в остальных output’ах не выводился NaN, а только в первом? и
нельзя ли без вот таких костылей как
сделать чтобы и в первом тоже не выводился NaN? (ведь остальные output’ы обходятся без
и не выдают NaN когда в input’ах появляется пустота)
0 |
sad67man 2031 / 1115 / 566 Регистрация: 23.08.2015 Сообщений: 2,837 |
||||
17.05.2016, 01:12 |
13 |
|||
Сообщение было отмечено Shekanya как решение РешениеShekanya, У вас же там условия стоят hh<30 и т.д. везде false получается Добавлено через 4 минуты
1 |
Shekanya 0 / 0 / 0 Регистрация: 09.04.2016 Сообщений: 9 |
||||||||||||||||||||||||
18.05.2016, 13:14 [ТС] |
14 |
|||||||||||||||||||||||
Shekanya, У вас же там условия стоят hh<30 и т.д. везде false получается Добавлено через 4 минуты
Понятно)
пришлось также поставить еще вот это
и вот это
ибо при чекании чекбокса с пустыми полями NaN теперь перебЁг и на них))) А
— это пожалуй то что нужно — NaN более не проявляется нигде, и ни при каких движениях… Даже
не понадобилось добавлять. Странно конечно)
0 |
2031 / 1115 / 566 Регистрация: 23.08.2015 Сообщений: 2,837 |
|
18.05.2016, 19:54 |
15 |
Shekanya, Здесь вот в чем дело
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
18.05.2016, 19:54 |
15 |
Сводка
Глобальное свойство NaN
является значением, представляющим не-число (Not-A-Number).
Атрибуты свойства NaN |
|
---|---|
Записываемое | нет |
Перечисляемое | нет |
Настраиваемое | нет |
Интерактивный пример
Описание
NaN
является свойством глобального объекта.
Начальным значением NaN
является Not-A-Number (не-число) — то же самое значение, что и у Number.NaN
. В современных браузерах NaN
является ненастраиваемым и незаписываемым свойством. Даже когда это не так, избегайте его переопределения.
В программах NaN
используется довольно редко. Это возвращаемое значение в ситуациях, когда математические (Math
) функции не срабатывают должным образом (например, при вызове Math.sqrt(-1)
) или когда функция, пытающаяся считать число из строки, терпит неудачу по причине того, что в строке не число (parseInt('blabla')
).
Проверка на равенство NaN
NaN
является неравным (посредством сравнения через ==
, !=
, ===
, and !==
) любому другому значению, включая другое значение NaN. Используйте Number.isNaN()
или isNaN()
, чтобы наиболее понятным образом определить является ли значение значением NaN. Или выполните само-сравнение: NaN, и только NaN, в результате такого сравнения будет неравным самому себе.
NaN === NaN; // false
Number.NaN === NaN; // false
isNaN(NaN); // true
isNaN(Number.NaN); // true
function valueIsNaN(v) { return v !== v; }
valueIsNaN(1); // false
valueIsNaN(NaN); // true
valueIsNaN(Number.NaN); // true
Тем не менее, обратите внимание на разницу между функцией isNaN()
и методом Number.isNaN()
: первая вернёт true
, если значение в настоящий момент является NaN
, или если оно станет NaN
после того, как преобразуется в число, в то время как последний вернёт true
, только если текущим значением является NaN
:
isNaN('hello world'); // true
Number.isNaN('hello world'); // false
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-value-properties-of-the-global-object-nan |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Summary: in this tutorial, you’ll learn about the JavasScript NaN
, how to check if a value is NaN
, and how to handle NaN
effectively.
Introduction to JavaScript NaN
JavaScript has the number type that allows you to represent numbers including integer and floating-point numbers. And JavaScript number has a special value called NaN
, which stands for Not-a–Number.
The NaN
is a property of the global object. The global object is the window
object in web browsers:
Code language: JavaScript (javascript)
window.NaN
And the global object in Node.js.
Code language: CSS (css)
global.NaN
The NaN
has the type number
as shown in the following code:
Code language: JavaScript (javascript)
console.log(typeof NaN); // number
Checking if a value is NaN
JavaScript provides you with the global function isNaN()
that returns true
if its argument is NaN
:
Code language: JavaScript (javascript)
isNaN(valueToCheck)
For example:
Code language: JavaScript (javascript)
const result = 100 + 0 / 0; console.log(isNaN(result)); // true
Why use NaN
JavaScript uses NaN
as the result of a failed operation on numbers including:
- Parsing numbers
- Using
undefined
as an operand - Using
NaN
as an operand - Using indeterminate forms
- Passing invalid arguments to a math function
Operations return NaN
1) Parsing numbers
In JavaScript, you can convert a numeric string to a number. For example:
Code language: JavaScript (javascript)
const input = '100'; const num = parseInt(input); console.log(num); // 100
If JavaScript cannot convert a string to a number, it returns NaN
. In this case, NaN
indicates that the parsing has failed. For example:
Code language: JavaScript (javascript)
const input = 'X100'; const num = parseInt(input); console.log(num); // NaN
It’s good practice to verify the parsing result using the isNaN
function:
Code language: JavaScript (javascript)
const input = 'X100'; const num = parseInt(input); // set num to 0 if parsing failed if (isNaN(num)) { num = 0; } console.log(num); // 0
In this example, the parsing has failed therefore it returned NaN
. The condition isNaN(num)
is true so that the number is assigned to 0
.
2) Use undefined as an operand
An expression that uses undefined
as an operand returns NaN
. For example:
Code language: JavaScript (javascript)
console.log(undefined * 2); // NaN
In practice, you’ll deal with undefined quite often. For example, when you access a non-existing property of an HTML element and use it in a calculation.
It’s good practice to avoid using undefined
in calculation.
3) Using NaN as an operand
When an expression has the NaN, it always returns NaN. For example:
Code language: JavaScript (javascript)
const result = 10 + 1 / NaN; console.log(result); // NaN
4) Using indeterminate forms
When an arithmetical operation is in the indeterminate form, it returns NaN. For example:
Code language: JavaScript (javascript)
const result = 10 + 0 / 0; console.log(result); // NaN
5) Using invalid arguments of math functions
When a math function receives an invalid argument, it returns NaN. For example:
Code language: JavaScript (javascript)
const result = Math.sqrt(-1); console.log(result); // NaN
In this example, the Math.sqrt()
that returns the square root of a number. Since it only accepts a non-negative number, passing -1 results in NaN
.
Summary
- NaN stands for Not-a-Number. It is a special value of the
NaN
property of the global object. - NaN indicates a failed operation on numbers.
- Use
isNaN()
function to check if a value isNaN
.
Was this tutorial helpful ?