JavaScript. Подробное руководство, 6-е издание, стр. 19

<b>Infinity                   // Переменная, доступная для чтения/записи,</b>

<b>                           // инициализированная значением Infinity.</b>

<b>Number.POSITIVE_INFINITY   // То же значение, доступное только для чтения. </b>

<b>1/0                        // То же самое значение.</b>

<b>Number.MAX_VALUE + 1       // Это выражение также возвращает Infinity.</b>

<b>Number.NEGATIVE_INFINITY   // Возвращают отрицательную бесконечность.</b>

<b>-Infinity</b>

<b>-1/0</b>

<b>-Number.MAX_VALUE - 1</b>

<b>NaN                        // Переменная, доступная для чтения/записи,</b>

<b>                           // инициализированная значением NaN.</b>

<b>Number.NaN                 // Свойство, доступное только для чтения, с тем же значением.</b>

<b>0/0                        // Возвращает NaN.</b>

<b>Number.MIN_VALUE/2         // Потеря значащих разрядов: возвращает 0</b>

<b>-Number.MIN_VALUE/2        // Отрицательный ноль</b>

<b>-1/Infinity                 // Также отрицательный ноль</b>

<b>-0</b>

Значение «не число» в JavaScript обладает одной необычной особенностью: операция проверки на равенство всегда возвращает отрицательный результат, даже если сравнить его с самим собой. Это означает, что нельзя использовать проверку

<b>х == NaN</b>
, чтобы определить, является значение переменной
<b>х</b>
значением
<b>NaN</b>
. Вместо этого следует выполнять проверку
<b>х != х</b>
. Эта проверка вернет
<b>true</b>
тогда и только тогда, когда
<b>х</b>
имеет значение
<b>NaN</b>
. Аналогичную проверку можно выполнить с помощью функции
<b>isNaN()</b>
. Она возвращает
<b>true</b>
, если аргумент имеет значение
<b>NaN</b>
или если аргумент является нечисловым значением, таким как строка или объект. Родственная функция
<b>isFinite()</b>
возвращает
<b>true</b>
, если аргумент является числом, отличным от
<b>NaN</b>
,
<b>Infinity</b>
или
<b>-Infinity</b>
.

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

<b>var zero = 0;     // Обычный ноль</b>

<b>var negz = -0;    // Отрицательный ноль</b>

<b>zero === negz     // =&gt; true: ноль и отрицательный ноль равны </b>

<b>1/zero === 1/negz // =&gt; false: Infinity и -Infinity не равны</b>

3.1.4. Двоичное представление вещественных чисел и ошибки округления

Вещественных чисел существует бесконечно много, но формат представления вещественных чисел в JavaScript позволяет точно выразить лишь ограниченное их количество (точнее, 18437736874454810627). Это значит, что при работе с вещественными числами в JavaScript представление числа часто будет являться округлением фактического числа.

Стандарт представления вещественных чисел IEEE-754, используемый в JavaScript (и практически во всех других современных языках программирования), определяет двоичный формат их представления, который может обеспечить точное представление таких дробных значений, как 1/2, 1/8 и 1/1024. К сожалению, чаще всего мы пользуемся десятичными дробями (особенно при выполнении финансовых расчетов), такими как 1/10,1/100 и т. д. Двоичное представление вещественных чисел неспособно обеспечить точное представление таких простых чисел, как 0.1.

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

<b>var х = .3 - .2; // тридцать копеек минус двадцать копеек</b>

<b>var у = .2 - .1; // двадцать копеек минус 10 копеек</b>

<b>x == y; // =&gt; false: получились два разных значения</b>

<b>X == .1 // =&gt; false: .3-.2 не равно .1</b>

<b>У == .1 // =&gt; true: .2-.1 равно .1</b>

Из-за ошибок округления разность между аппроксимациями чисел .3 и .2 оказалась не равной разности между аппроксимациями чисел .2 и .1. Важно понимать, что эта проблема не является чем-то характерным для JavaScript: она проявляется во всех языках программирования, где используется двоичное представление вещественных чисел. Кроме того, обратите внимание, что значения х и у в примере выше очень близки друг к другу и к истинному значению. Точность округления вполне приемлема для большинства применений: проблема возникает лишь при попытках проверить значения на равенство.

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

3.1.5. Дата и время

В базовом языке JavaScript имеется конструктор Date() для создания объектов, представляющих дату и время. Эти объекты Date обладают методами для выполнения простых вычислений с участием дат. Объект Date не является фундаментальным типом данных, как числа. Этот раздел представляет собой краткое пособие по работе с датами. Полное описание можно найти в справочном разделе:

<b>var then = new Date(2010, 0, 1); // Первый день первого месяца 2010 года </b>