Чтение онлайн

ЖАНРЫ

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

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

– Number.MIN_VALUE/2 // Отрицательный ноль

– 1/Infinity // Также отрицательный ноль

– 0

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

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

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

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

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

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

1/zero === 1/negz // => false: Infinity и -Infinity не равны

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

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

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

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

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

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

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

X == .1 // => false: .3-.2 не равно .1

У == .1 // => true: .2-.1 равно .1

Из-за

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

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

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

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

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

var later = new Date(2010, 0, 1, 17, 10, 30);// Та же дата, в 17:10:30 локального времени

var now = new Date;// Текущие дата и время

var elapsed = now - then; // Разность дат: интервал в миллисекундах

later.getFullYear// => 2010

later.getMonth // => 0: счет месяцев начинается с нуля

later.getDate // => 1: счет дней начинается с единицы

later.getDay // => 5: день недели. 0 - воскр., 5 - пяти.

later.getHours // => 17: 17 часов локального времени

later.getUTCHours // часы по UTC; зависит от часового пояса

later.toStrlng

// => "Fri Jan 01 2010 17:10:30 GMT+0300"

later.toUTCString // => "Fri, 01 Jan 2010 14:10:30 GMT"

later.toLocaleDateString // => "1 Январь 2010 г."

later.toLocaleTimeString // => "17:10:30"

later.toIS0String // => "2010-01-01T14:10:30.000Z"

3.2. Текст

Строка - это неизменяемая, упорядоченная последовательность 16-битных значений, каждое из которых обычно представляет символ Юникода. Строки в JavaScript являются типом данных, используемым для представления текста. Длина строки - это количество 16-битных значений, содержащихся в ней. Нумерация символов в строках (и элементов в массивах) в языке JavaScript начинается с нуля: первое 16-битное значение находится в позиции 0, второе - в позиции 1 и т. д. Пустая строка - это строка, длина которой равна 0. В языке JavaScript нет специального типа для представления единственного элемента строки. Для представления единственного 16-битного значения просто используется строка с длиной, равной 1.

Поделиться с друзьями: