Статьи

Веселье с номерами JavaScript

Типы данных являются неотъемлемым компонентом каждого языка программирования, а числа, возможно, являются наиболее важными из всех типов данных. Ведь компьютеры действительно просто дорогие калькуляторы. Как и любой стоящий язык программирования, JavaScript поддерживает числовые данные. Однако, как и во многих других аспектах JavaScript, у чисел есть несколько сложностей, которые могут укусить вас, если вы не будете осторожны. В этой статье рассматриваются числовые данные и некоторые из его особенностей.

Примечание. Перед прочтением этой статьи вы должны быть знакомы с типами данных JavaScript .

Тип номера

В JavaScript все числа представлены с использованием типа данных Number. Это включает в себя целые числа, действительные числа, шестнадцатеричные числа и числа, написанные в научной записи. Следующий пример подтверждает это, применяя оператор Number к различным числам. Каждое приложение typeoftypeof

 number

В предыдущем примере числа принимали различные форматы. Однако внутри все числа JavaScript фактически представлены как данные с плавающей точкой IEEE 754 . Это важно, потому что это означает, что JavaScript не имеет понятия целых чисел, несмотря на функцию typeof(100);
typeof(3.14);
typeof(0xDEADBEEF);
typeof(7.89e2);
.
Это также означает, что математика JavaScript не на 100% точна. Например, рассмотрим следующее выражение.

 parseInt()

Если вы не знакомы с числами с плавающей запятой, вы наверняка ожидаете, что это выражение будет иметь значение (0.1 + 0.2) === 0.3 В конце концов, 0,1 + 0,2 равно 0,3. Однако из-за способа работы чисел с плавающей запятой сумма фактически равна 0,30000000000000004. Разница небольшая, но этого достаточно, чтобы все выражение оценивалось как true

Положительный и отрицательный ноль

Еще одна особенность стандарта IEEE 754 — ноль со знаком. Это приводит к двум нулям — положительный ноль +0 и отрицательный ноль -0. Это может показаться странным, но веселье только начинается. Ясно, что это два разных значения, иначе был бы только один ноль. Однако, если вы отобразите любое из нулей, знак будет удален. Например, следующий код пытается отобразить два нулевых значения рядом.

 false

Что еще хуже, операторы сравнения JavaScript не могут различать два значения, как показано в следующем примере.

 alert((+0) + " " + (-0));
// displays 0 0

Существует довольно простой способ решения этой проблемы. В JavaScript деление на ноль дает alert((+0 === -0));
// displays true
alert((-0 < +0));
// displays false
Аналогично, деление на отрицательный ноль дает Infinity Поэтому, чтобы определить, равно ли число -0, мы должны проверить, что это ноль, затем выполнить деление с ним в качестве знаменателя и проверить -Infinity

 -Infinity

Не-а-Number

JavaScript фактически определяет число с именем Not-a-Number или function isNegativeZero(x) {
return (x === 0 && (1/x) === -Infinity);
}
NaNложное значение, которое используется для представления не чисел в виде чисел. Это значение интересно, потому что само его имя не позволяет ему быть числом, а NaNtypeof(NaN) number Например, следующий код вернет NaN

 false

Вместо использования операторов сравнения вы можете проверить alert((NaN === NaN));
// displays false
NaN , как показано ниже.

 isNaN()

Однако isNaN(1);
// returns false
isNaN(NaN);
// returns true
isNaN()
Если вы передадите значение, которое может быть приведено к числу, isNaN()false В следующем примере isNaN() Однако каждый вызов возвращает false

 isNaN(true);
isNaN(false);
isNaN("");
isNaN(null);
// all return false

Лучший способ проверить наличие NaN Следующие функциональные тесты для NaN Эта функция будет возвращать trueNaN

 function isNotANumber(x) {
  return x !== x;
}

Другие забавные времена

Есть несколько других сценариев, которые могут привести к проблемам с числами. Для начала вам следует остерегаться старых браузеров, которые позволяют переопределять глобальные свойства, такие как InfinityNaNundefined Например, следующий код может создать много проблем, если NaN К счастью, современные браузеры будут игнорировать присвоения ранее упомянутым свойствам. Строгий режим делает еще один шаг вперед, превращая эти тихие сбои в ошибки.

 NaN = 1;
...
isNaN(NaN);
// now returns false

Еще одна забавная диагностика ошибки — добавление числа и строки. Пример этого показан ниже. В этом случае конкатенация строк переопределяет добавление. Это приводит к преобразованию foo"100" Конечным результатом является строка "1001"

 var foo = 100;
var bar = "1";

alert(foo + bar);
// displays "1001"

Вывод

В этой статье были рассмотрены некоторые особенности чисел в JavaScript. Надеюсь, теперь вы понимаете, почему эти проблемы возникают, и как вы можете их избежать. И, хотя вы не можете часто сталкиваться с такими случаями, как отрицательный ноль, по крайней мере, теперь вы готовы.