Московский физико-технический институт
Опубликован: 23.12.2005 | Доступ: свободный | Студентов: 2765 / 183 | Оценка: 4.61 / 4.44 | Длительность: 27:18:00
ISBN: 978-5-9556-0051-2
Лекция 2:

Базовые понятия Action Script

Нечисловые значения типа Number

Мы посвятили довольно много времени разбору представления чисел в типе Number. Однако в этом типе могут храниться не только числовые, а точнее - не совсем числовые значения. Всего этих специальных значений имеется три. Два из них служат для обозначения бесконечности. Причем бесконечность бывает разная: положительная и отрицательная. В этом есть некоторый смысл, поскольку положительная бесконечность всего лишь обозначает любое число, большее, чем Number.MAX_VALUE. А отрицательная - число, меньшее чем (-Number.MAX_VALUE). Хотя при делении на ноль есть некоторый произвол - какую именно из бесконечностей употребить. А вот при попытке вычислить логарифм нуля мы всегда получим именно минус бесконечность, что естественно. Так вот, положительной бесконечности соответствует константа Number.POSITIVE_INFINITY. А отрицательной, соответственно - константа Number.NEGATIVE_INFINITY. При преобразовании в строку эти константы обращаются в Infinity и -Infinity. Вот парочка примеров с использованием этих значений:

trace("5/0 = " + 5/0);
trace("-5/0 = " + -5/0);
trace("-5/-0 = " + -5/-0);
trace("-5/Number.MIN_VALUE = " + -5/Number.MIN_VALUE);
trace("-5/-Number.MIN_VALUE = " + -5/-Number.MIN_VALUE);
trace("Math.log(0) = " + Math.log(0));
trace("Math.sqrt(-1) = " + Math.sqrt(-1));

На выходе получаем:

5/0 = Infinity
-5/0 = -Infinity
-5/-0 = -Infinity
-5/Number.MIN_VALUE = -Infinity
-5/-Number.MIN_VALUE = Infinity
Math.log(0) = -Infinity
Math.sqrt(-1) = NaN

Видим, что попытка обнаружить разницу между 0 и (-0) провалилась - выражение (-0) тут же вычисляется и получает значение, равное 0. А вот если вместо 0 использовать Number.MIN_VALUE (наименьшее по абсолютной величине число, которое отличается от нуля) - тут уже разница между Number.MIN_VALUE и (- Number.MIN_VALUE) отчетливо видна.

Но вернемся к нечисловым значениям Number. Последнее из них (с которым, тем не менее, довольно часто приходится иметь дело) - это Number.NaN (при преобразовании в строку переводится в " NaN "). Название это является сокращением от " Not a Number " - "не число". Употребляется NaN для значений выражений, которые невозможно представить в виде действительного (хотя бы и бесконечного) числа. Пример мы только что видели - значением выражения Math.sqrt(-1) является Number.NaN. Кроме того, выражения c арифметическими операторами, подразумевающими преобразование к Number, в которые попали типы данных, не работающие с подобными операторами, также приобретают значение Number.NaN. Примером типов, приобретающих значение Number.NaN при преобразовании к Number, являются, например, String или Function. Заметьте, что в одном из предыдущих примеров в выражениях, наподобие trace("x = " + x + "; y = " + y + "; x - y = " + (x - y)) арифметические вычисления взяты в скобки. Если скобки убрать, значением выражения станет Number.NaN, поскольку вся начальная часть выражения преобразуется в строку, а затем эта строка будет приведена к типу Number при попытке вычесть из нее число y.

Кстати, писать именно Number.NaN необязательно. Можно употреблять и просто NaN. Также существует и предопределенная переменная Infinity (хотя редактор ActionScript среды Флэш МХ ее не узнает и не подсвечивает, но пользоваться ей можно и означает она то же самое, что и Number.POSITIVE_INFINITY ). Можем ли мы проверить, что Number.NaN и NaN - это действительно одно и то же? Ведь оператор == не работает со значением NaN (всегда выдает false ). Для подобной проверки есть функция isNaN. Сейчас мы продемонстрируем ее работу (и работу в чем-то родственной функции isFinite ). Вот такой код

trace("NaN на печати выглядит как " + NaN);
trace("isNaN(NaN) = " + isNaN(NaN));
trace("Infinity на печати выглядит как " + Infinity);
trace("-Infinity на печати выглядит как " + (-Infinity));
trace("Number.NEGATIVE_INFINITY на печати дает "
    + Number.NEGATIVE_INFINITY);
trace("-Number.NEGATIVE_INFINITY на печати дает "
    + -Number.NEGATIVE_INFINITY);
trace("isFinite(Infinity) = " + isFinite(Infinity));
trace("1/Infinity = " + 1/Infinity);

выводит

NaN на печати выглядит как NaN
isNaN(NaN) = true
Infinity на печати выглядит как Infinity
-Infinity на печати выглядит как -Infinity
Number.NEGATIVE_INFINITY на печати дает -Infinity
-Number.NEGATIVE_INFINITY на печати дает Infinity
isFinite(Infinity) = false
1/Infinity = 0