Числа в JS

Эпичный сборник подводных камней с числами в JavaScript 😒

У JS потрясающие числа. Каждое из которых может быть:

  1. целым,
  2. дробным,
  3. шестнадцатеричным,
  4. экспонентой,
  5. +Infinity,
  6. -Infinity,
  7. и …NaN (да, Not a Number. Не число — это число! Притом, NaN не равен NaN… что логично и иронично).
  8. …или число вообще может быть сравнимо-несравнимым объектом:

…потому, что объекты в JS сравнить нельзя. Зато в сравнении с примитивами они преобразовываются в примитив. Непонятно, зачем есть разновидность объекта Number, но возможность — безусловно — интересная.

Бесконечность аналогично доставляет:

…Нет, Infinity + (-Infinity) это не 0.

…Это NaN!

То есть, если на сервер прилетает ответ от клиента, надо:

  1. Убедиться, что это Number, (if typeof x !== 'undefined' && typeof x === 'Number');
  2. Убедиться, что Number в пределах разумного. isFinite();
  3. Убедиться, что Number не NaN! isNaN(); (или см. ниже в примере);
  4. Убедиться, что Number нужного формата (например, дробное содержит точку x.toString().indexOf(".") == -1).

Сам по себе NaN тоже доставляет, т.к. такое число не равно самому себе:

Можно использовать для проверки на NaN, если забыли про isNaN();.

…да и дроби отдельный лулз:

…Вот что происходит, когда все без разбору числа принудительно 64-битные. Где-то в памяти должно быть 6, но на них не хватило бит.

И даже null по-своему троллит; чем взрывает мозги начисто:

…т.е. null не больше нуля и не равно нулю. Но больше или равно нулю.

Кажется, это всё 🤔

Комментарии: