NaN в JavaScript

NaN в JavaScript

От автора: В данной статье мы познакомимся со специальным свойством NaN (Not-A-Number), которое является значением, представляющим не-число.

Тип числа в JavaScript содержит целые числа и числа с плавающей запятой:

const integer = 4;
const float = 1.5; typeof integer; // => 'number'
typeof float; // => 'number'

Плюс есть два специальных числовых значения: Infinity (число больше, чем любое другое число) и NaN (представляющее концепцию «не число»):

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:

1 * undefined; // => NaN

Также попытка разобрать недопустимую числовую строку, например, ‘Joker’ приводит к NaN:

parseInt('Joker', 10); // => NaN

2. Проверка на равенство с NaN

Интересным свойством NaN является то, что оно не равно ни одному значению, даже самому себе:

NaN === NaN; // => false

Это поведение полезно для определения, является ли переменная 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: указывая, что синтаксический анализ не выполнен. Вот некоторые примеры:

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:

0 * Infinity; // => NaN

Сложение бесконечных чисел с разными знаками:

-Infinity + Infinity; // => NaN

3.5 Неверные аргументы математических функций

Квадратный корень из отрицательного числа:

Math.pow(-2, 0.5); // => NaN
(-2) ** 0.5; // => NaN

Или логарифм отрицательного числа:

Math.log2(-2); // => NaN

4. Заключение

Понятие «не число», выраженное в JavaScript с помощью NaN, полезно для представления ошибочных операций над числами. NaN не равно ни одному значению, даже самому себе. Рекомендуемый способ проверить, содержит ли переменная NaN — использовать Number.isNaN(value).

Преобразование числовых строк в числа, в случае неудачи может дать NaN. Рекомендуется проверять, не возвращают ли parseInt(), parseFloat() или Number() NaN.

Если undefined или NaN используются в качестве операнда в арифметических операциях, это обычно приводит к NaN. Правильная обработка undefined (предоставление значений по умолчанию для отсутствующих свойств) является рекомендованным подходом для предотвращения этой ситуации.

Неопределенные формы или недопустимые аргументы для математических функций также приводят получению NaN. Но это случается редко. Вот мой практический совет: «Получили NaN? Ищите undefined!»

Автор: Dmitri Pavlutin

Источник: https://dmitripavlutin.com

Редакция: Команда webformyself.