Казахстан, Алматы, Гимназия им. Ахмета Байтурсынова №139, 2008 |
Базовые понятия 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