Типы данных

Тип данных определяет набор значений. Например, тип данных Boolean является набором всего из двух значений: true и false. Помимо типа данных Boolean в ActionScript 3.0 определяется несколько более часто используемых типов данных, таких как строки (String), числовые значения (Number) и массивы (Array). Можно определить собственный тип данных, используя классы или интерфейсы для определения нестандартного набора значений. Все значения в ActionScript 3.0, независимо от того, примитивные они или сложные, являются объектами.

Примитивное значение — это значение, которое относится к одному из следующих типов данных: Boolean, int, Number, String и uint. Работать с примитивными значениями обычно получается быстрее, чем со сложными, поскольку ActionScript хранит примитивные значения специальным способом, делая возможным оптимизацию быстродействия и использования памяти.

Примечание. Читателям, заинтересованным в технических подробностях, любопытно будет узнать, что внутренним форматом хранения примитивных значений в ActionScript являются постоянные объекты. Тот факт, что они хранятся как постоянные объекты, означает, что вместо передачи самих значений можно передавать ссылки на них. Это сократит потребление памяти и повысит скорость выполнения, поскольку ссылки обычно значительно меньше, чем сами значения.

Сложное значение — это альтернатива примитивным значениям. К типам данных, определяющих наборы сложных значений, относятся Array, Date, Error, Function, RegExp, XML и XMLList.

Во многих языках программирования существуют различия между примитивными значениями и интерфейсными объектами. Например, в Java имеется примитивное значение int и класс java.lang.Integer, который служит интерфейсом к нему. Примитивы Java не являются объектами, но таковы их интерфейсные объекты, с помощью которых примитивы становятся пригодны для некоторых операций, а интерфейсные объекты лучше подходят для других операций. В ActionScript 3.0 в практических целях простые значения и их интерфейсные объекты неразличимы. Все значения, даже простые значения, являются объектами. Среда выполнения обрабатывает эти простые типы как особые случаи, поскольку они ведут себя как объекты, но при этом не требуют обычной нагрузки, связанной с созданием объектов. Это значит, что следующие две строки программного кода эквивалентны.

var someInt:int = 3; 
var someInt:int = new int(3);

Все примитивные и сложные типы данных, перечисленные выше, определяются классами ядра ActionScript 3.0. Классы ядра позволяют создавать объекты с помощью литеральных значений вместо использования оператора new. Например, можно создать массив с помощью литерального значения или конструктора класса Array, как показано в следующем примере.

var someArray:Array = [1, 2, 3]; // literal value 
var someArray:Array = new Array(1,2,3); // Array constructor

Проверка типа

Проверка типа может производиться либо во время компиляции, либо во время выполнения. В языках статичного типа, таких как C++ и Java, проверка типа выполняется при компиляции. В языках динамического типа, таких как Smalltalk и Python, проверка типа возможна во время выполнения. Являясь языком динамического типа, ActionScript 3.0 позволяет проверку типа во время выполнения, но также поддерживает проверку типа при компиляции благодаря специальному режиму компиляции, называемому строгим режимом. В строгом режиме проверка типа происходит как во время компиляции, так и во время выполнения, а в стандартном режиме проверка возможна только во время выполнения.

Языки динамического типа предлагают значительную гибкость при структурировании программного кода, но иногда из-за этого происходят ошибки типов, которые обнаруживаются во время выполнения. В языках статического типа ошибки типов обнаруживаются во время компиляции, но для этого необходимо, чтобы информация о типе была известна во время компиляции.

Проверка типа во время компиляции

Проверка типа во время компиляции часто более предпочтительна в крупных проектах, поскольку по мере роста проекта гибкость типов данных обычно становится менее важной, чем необходимость отслеживания ошибок на максимально ранних стадиях. Вот почему по умолчанию компилятор ActionScript в инструментах Flash Professional и Flash Builder установлен для работы в строгом режиме.

Adobe Flash Builder

Строгий режим во Flash Builder можно отключить с помощью настроек компилятора ActionScript в диалоговом окне «Свойства проекта».

Чтобы обеспечить возможность проверки во время компиляции, компилятору необходимо располагать сведениями о типах данных для переменных и выражений в программном коде. Чтобы явным образом объявить тип данных для переменной, добавьте оператор двоеточия (:) с последующим указанием типа данных в качестве суффикса к имени переменной. Чтобы связать тип данных с параметром, используется оператор двоеточия с последующим указанием типа данных. Например, в следующем программном коде к параметру xParam добавляются сведения о типе данных, а затем объявляется переменная myParam с явно указанным типом данных.

function runtimeTest(xParam:String) 
{ 
    trace(xParam); 
} 
var myParam:String = "hello"; 
runtimeTest(myParam);

В строгом режиме работы компилятор ActionScript сообщает о несоответствиях типов как об ошибках компиляции. Например, в следующем программном коде объявляется параметр функции xParam с типом Object, но затем предпринимается попытка назначить этому параметру значения типа String и Number. При этом в строгом режиме работы компилятора выдаются ошибки.

function dynamicTest(xParam:Object) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; // compiler error in strict mode 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; // compiler error in strict mode 
        trace("Number: " + myNum); 
    } 
}

Однако даже в строгом режиме можно селективно отключать проверку типа во время компиляции, оставляя незаполненной правую часть инструкции присваивания. Можно пометить переменную или выражение как не имеющие типа, либо пропустив аннотацию типа, либо используя специальную аннотацию типа с помощью звездочки (*). Например, если параметр xParam в предыдущем примере изменяется так, что больше не имеет аннотации типа, программный код компилируется в строгом режиме:

function dynamicTest(xParam) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; 
        trace("Number: " + myNum); 
    } 
} 
dynamicTest(100) 
dynamicTest("one hundred");

Проверка типа при выполнении

Проверки типа при выполнении в ActionScript 3.0 происходит независимо от того, идет работа в строгом или в стандартном режиме. Рассмотрите ситуацию, в которой значение 3 передается в качестве аргумента функции, ожидающей массив. В строгом режиме компилятор создаст ошибку, поскольку значение 3 не совместимо с типом данных Array. Если отключить строгий режим и выполнять программу в стандартном режиме, компилятор пропустит несоответствие типов, но при проверке типа во время выполнения возникнет ошибка выполнения.

В следующем примере показана функция с именем typeTest(), которая ожидает аргумент Array, но ей передается значение 3. Это вызывает ошибку выполнения в стандартном режиме, поскольку значение 3 не является членом объявленного для параметра типа данных (Array).

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum:Number = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0 standard mode

Также возможны ситуации, когда ошибки выполнения возникают при работе в строгом режиме. Это возможно в тех случаях, если используется строгий режим, но выключена проверка типа при компиляции при использовании переменных без указания типа. Если используются переменные без указания типа, проверка типа не отключается полностью, а просто откладывается до выполнения программного кода. Например, если для переменной myNum в предыдущем примере не объявлен тип данных, компилятор не сможет определить несоответствие типов, но при выполнении кода возникнет ошибка выполнения, поскольку сравнивается значение при выполнении переменной myNum, установленное с помощью команды присваивания и равное 3, с типом xParam, для которого задан тип данных Array.

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0

Проверка типа при выполнении позволяет более гибко использовать наследование, чем при проверке во время компиляции. Откладывая проверку типа до времени выполнения, стандартный режим позволяет ссылаться на свойства подкласса даже в том случае, если выполняется восходящее преобразование. Восходящее преобразование происходит, если для объявления типа экземпляра класса используется базовый класс, а для его инициации используется подкласс. Например, можно создать класс с именем ClassBase, который может быть расширен (классы с атрибутом final не могут быть расширены).

class ClassBase 
{ 
}

Затем можно создать подкласс ClassBase с именем ClassExtender, у которого есть одно свойство с именем someString, как показано в следующем примере.

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

Используя оба класса, можно создать экземпляр класса, объявляемый с типом данных ClassBase, но инициируемый с помощью конструктора ClassExtender. Восходящее преобразование считается безопасной операцией, поскольку базовый класс не содержит каких-либо свойств или методов, которых не было бы в подклассе.

var myClass:ClassBase = new ClassExtender();

В то же время подкласс содержит свойства или методы, которые отсутствуют в базовом классе. Например, класс ClassExtender содержит свойство someString, не существующее в классе ClassBase. В стандартном режиме работы ActionScript 3.0 можно ссылаться на это свойство с помощью экземпляра myClass, не создавая ошибки во время компиляции, как показано в следующем примере.

var myClass:ClassBase = new ClassExtender(); 
myClass.someString = "hello"; 
// no error in ActionScript 3.0 standard mode

Оператор is

Оператор is позволяет проверить, является ли переменная или выражение членом определенного типа данных. В предыдущих версиях ActionScript оператор instanceof обеспечивал данную функциональную возможность, но в ActionScript 3.0 оператор instanceof не следует использовать для проверки принадлежности к типу данных. Оператор is необходимо использовать вместо оператора instanceof для проверки типа вручную, поскольку выражение x instanceof y проверяет только цепочку прототипа x на существование y (а в ActionScript 3.0 цепочка прототипа не передает полной картины иерархии наследования).

Оператор is проверяет правильность иерархии наследования и может применяться для проверки не только того, является ли объект экземпляром определенного класса, но также является ли объект экземпляром класса, реализующего определенный интерфейс. В следующем примере создается экземпляр класса Sprite с именем mySprite, который использует оператор is для проверки того, является ли mySprite экземпляром классов Sprite и DisplayObject, а также реализует ли он интерфейс IEventDispatcher.

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

Оператор is проверяет иерархию наследования и правильно диагностирует, что mySprite совместим с классами Sprite и DisplayObject (класс Sprite является подклассом класса DisplayObject). Оператор is также проверяет, действительно ли mySprite наследует от какого-либо класса, в котором реализован интерфейс IEventDispatcher. Поскольку класс Sprite наследует от класса EventDispatcher, в котором реализован интерфейс IEventDispatcher, оператор is правильно сообщает, что в классе mySprite также реализован этот интерфейс.

В следующем примере показаны те же тесты из предыдущего примера, но с оператором instanceof вместо оператора is. Оператор instanceof правильно определяет, что класс mySprite является экземпляром классов Sprite или DisplayObject, но он возвращает результат false при попытке проверить, реализует ли класс mySprite интерфейс IEventDispatcher.

trace(mySprite instanceof Sprite); // true 
trace(mySprite instanceof DisplayObject);// true 
trace(mySprite instanceof IEventDispatcher); // false

Оператор as

Оператор as также позволяет проверить, является ли переменная или выражение членом определенного типа данных. В отличие от оператора is оператор as не возвращает логические значения. При этом оператор as возвращает значение выражения вместо true или значение null вместо false. В следующем примере показан результат использования оператора as вместо оператора is в простом случае проверки. Определяется, действительно ли экземпляр Sprite является членом типов данных DisplayObject, IEventDispatcher и Number.

var mySprite:Sprite = new Sprite(); 
trace(mySprite as Sprite);                 // [object Sprite] 
trace(mySprite as DisplayObject);                 // [object Sprite] 
trace(mySprite as IEventDispatcher);                 // [object Sprite] 
trace(mySprite as Number);                                       // null

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

Динамические классы

Динамический класс определяет объект, который может быть изменен во время выполнения путем добавления или изменения свойств и методов. Нединамические классы, такие как класс String, являются запечатанными классами. К запечатанным классам нельзя добавлять свойства или методы во время выполнения.

Динамический класс создается с помощью атрибута dynamic при объявлении класса. Например, в следующем программном коде создается динамический класс с именем Protean.

dynamic class Protean 
{ 
    private var privateGreeting:String = "hi"; 
    public var publicGreeting:String = "hello"; 
    function Protean() 
    { 
        trace("Protean instance created"); 
    } 
}

Если впоследствии создается экземпляр класса Protean, можно добавлять свойства и методы к нему за пределами определения класса. Например, в следующем программном коде создается экземпляр класса Protean и к нему добавляется свойство с именем aString, а также свойство с именем aNumber.

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
trace(myProtean.aString, myProtean.aNumber); // testing 3

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

Также к экземпляру myProtean можно добавить метод, определив функцию и прикрепив ее к свойству экземпляра myProtean. В следующем программном коде инструкция трассировки перемещается в метод с именем traceProtean().

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
myProtean.traceProtean = function () 
{ 
    trace(this.aString, this.aNumber); 
}; 
myProtean.traceProtean(); // testing 3

Методы, созданные таким способом, не имеют доступа к любым частным свойствам или методам класса Protean. Более того, даже ссылки на общие свойства или методы класса Protean должны уточняться с помощью ключевого слова this или имени класса. В следующем примере показан метод traceProtean(), пытающийся обращаться к частным или общим переменным класса Protean.

myProtean.traceProtean = function () 
{ 
    trace(myProtean.privateGreeting); // undefined 
    trace(myProtean.publicGreeting); // hello 
}; 
myProtean.traceProtean();

Описания типов данных

К примитивным типам данных относятся Boolean, int, Null, Number, String, uint и void. Классы ядра ActionScript также определяют следующие сложные типы данных: Object, Array, Date, Error, Function, RegExp, XML и XMLList.

Логический тип данных (Boolean)

Логический тип данных (Boolean) включает два значения: true и false. Никакие другие значения для переменных с типом Boolean не действительны. По умолчанию для переменной с типом Boolean, которая объявлена, но не инициализирована, устанавливается значение false.

Тип данных int

Тип данных int предназначен для внутреннего хранения информации в виде 32-разрядных целых чисел и включает подмножество целых чисел от

-2147483648 (-231) до 2147483647 (231 - 1) включительно. В предыдущих версиях ActionScript предлагался только тип данных Number, в котором использовались как целые числа, так и числа с плавающей точкой. В ActionScript 3.0 теперь есть доступ к двоичным типам нижнего уровня для работы с 32-разрядными целыми числами со знаком и без знака. Если переменная не использует числа с плавающей точкой, то применение типа данных int вместо типа данных Number позволит ускорить обработку данных и сделать ее более эффективной.

Для целых значений, выходящих за пределы диапазона минимального и максимального значений, используйте тип данных Number, с помощью которого можно обрабатывать значения в промежутке между положительным и отрицательным значением 9007199254740992 (53-разрядные целые значения). По умолчанию значение переменной с типом данных int равно 0.

Тип данных Null

Тип данных Null содержит только одно значение null. Это значение по умолчанию для типа данных String и всех классов, которые определяют сложные типы данных, включая класс Object. Никакой другой из примитивных типов данных, таких как Boolean, Number, int и uint, не может содержать значение null. Во время выполнения значение null преобразуется в соответствующее значение по умолчанию при попытке назначить значение null переменным типа Boolean, Number, int или uint. Нельзя использовать этот тип данных в качестве аннотации типа.

Тип данных Number

В ActionScript 3.0 тип данных Number может быть представлен целыми числами, целыми числами без знака, а также числами с плавающей точкой. В то же время, чтобы повысить производительность, необходимо использовать тип данных Number только для целых значений, которые не помещаются в 32-разрядных типах int и uint, или для значений с плавающей точкой. Для сохранения числа с плавающей точкой включите в него десятичную точку. Если десятичная точка пропущена, число сохраняется как целое.

В типе данных Number используется 64-разрядный формат с двойной точностью в соответствии со стандартом IEEE для двоичных арифметических операций с плавающей точкой (IEEE-754). Этот стандарт определяет, как числа с плавающей точкой сохраняются с помощью 64 доступных разрядов. Один разряд используется для обозначения того, положительным или отрицательным является число. Одиннадцать разрядов используются для экспоненциальной части, которая сохраняется с основанием 2. Оставшиеся 52 разряда используются для хранения значащей части числа (также называемой мантиссой), которая является числом, возводимым в степень, указанную в экспоненциальной части.

Используя некоторые из этих разрядов для хранения экспоненциальной части, тип данных Number может сохранять числа с плавающей точкой, значительно превышающие значения, которые бы получались, если бы все разряды были отведены под значащую часть числа. Например, если бы тип данных Number использовал все свои 64 разряда для сохранения значащей части числа, в нем можно было бы сохранить значение 265 - 1. Используя 11 разрядов для хранения экспоненциальной части, тип данных Number может возводить свою значимую часть в степень 21023.

Максимальное и минимальное значения, которые может воспроизводить класс Number, хранятся в статических свойствах класса Number, называемых Number.MAX_VALUE и Number.MIN_VALUE.

Number.MAX_VALUE == 1.79769313486231e+308 
Number.MIN_VALUE == 4.940656458412467e-324

Расплатой за возможность использовать столь огромный диапазон значений является точность. Тип данных Number использует 52 разряда для хранения значимой части числа, в результате числа, которым требуется больше 52 разрядов для точного воспроизведения, например 1/3, отображаются как приближенные значения. Если для приложения требуется абсолютная точность в работе с десятичными числами, необходимо использовать программное обеспечение, реализующее десятичные арифметические операции с плавающей точкой в качестве альтернативы двоичным операциям.

При сохранении целых значений с помощью типа данных Number для значимой части числа используется только 52 разряда. Тип данных Number использует эти 52 разряда и специальный скрытый разряд для представления целых чисел в диапазоне от -9007199254740992 (-253) до 9007199254740992 (253).

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

Примечание. Результатом деления на 0 является только NaN, если делитель тоже 0. В результате деления на 0 получается infinity, если делимое положительно, или -infinity, если делимое отрицательно.

Тип данных String

Тип данных String передает последовательность 16-разрядных символов. Для внутреннего хранения значений с типом String используются символы Unicode и формат UTF-16. Значения с типом данных String являются постоянными, такими же, как и при программировании в языке Java. Операция со значением String возвращает новый экземпляр этой строки. По умолчанию значением для переменной, объявленной с типом данных String, является null. Значение null не равнозначно пустой строке (""). Значение null обозначает, что в переменной не сохранено значение, а пустая строка обозначает, что в переменной сохранено значение строкового типа String, не содержащее символов.

Тип данных uint

Для внутреннего хранения типа данных uint используются 32-разрядные целые числа без знака. Этот тип данных содержит диапазон целых значений от 0 до 4294967295 (232 - 1) включительно. Тип данных uint применяется в особых случаях, когда необходимы положительные целые числа. Например, следует использовать тип данных uint для передачи значений цвета пиксела, поскольку тип данных int имеет внутренний разряд для знака, не удобный для обработки цветовых значений. Для целых значений, больших, чем максимальное значение uint, следует использовать тип данных Number, который позволяет обрабатывать 53-разрядные целые значения. По умолчанию значение переменной с типом данных uint равно 0.

Тип данных void

Тип данных void содержит только одно значение undefined. В предыдущих версиях ActionScript значение undefined было значением по умолчанию для экземпляров класса Object. В ActionScript 3.0 значением по умолчанию для экземпляров Object является null. При попытке назначить значение undefined экземпляру объекта Object значение преобразуется в null. Переменной, для которой не задан тип, можно назначить только значение undefined. Переменные без указания типа — это переменные, для которых либо отсутствует любая аннотация типа, либо указан символ звездочки (*) в качестве аннотации типа. Значение void можно использовать только для аннотации возвращаемого типа.

Тип данных Object

Тип данных Object определяется классом Object. Класс Object служит базовым классом для всех определений классов в ActionScript. В ActionScript 3.0 версия типа данных Object отличается от предыдущих версий тремя особенностями. Во-первых, тип данных Object больше не является типом данных по умолчанию, назначаемым переменным, для которых не задан тип. Во-вторых, тип данных Object больше не включает значение undefined, которое используется в качестве значения по умолчанию для экземпляров Object. В-третьих, в ActionScript 3.0 значением по умолчанию для экземпляров класса Object является null.

В предыдущих версиях ActionScript переменной без аннотации типа автоматически назначался тип Object. В ActionScript 3.0 это не так, здесь реализована концепция переменной, действительно не имеющей типа. Переменные без аннотации типа теперь расцениваются как переменные, не имеющие типа. Если требуется, чтобы читателям программного кода были ясны намерения автора оставить переменную без типа, можно использовать символ звездочки (*) для аннотации типа, что будет эквивалентно пропущенной аннотации типа. В следующем примере показаны две эквивалентные инструкции, обе они объявляют переменную x, не имеющую типа.

var x 
var x:*

Только переменная, не имеющая типа, может содержать значение undefined. Если попытаться назначить значение undefined переменной, имеющей тип данных, среда выполнения преобразует значение undefined в значение по умолчанию этого типа данных. Для экземпляров типа данных Object значением по умолчанию является null, а это значит, что при попытке присвоить значение undefined экземпляру Object значение преобразуется в null.

Преобразования типа

Преобразование типа происходит, если значение превращается из одного типа данных в другой. Преобразование типа может быть либо явным, либо подразумеваемым. Иногда во время выполнения выполняется скрытое преобразование, которое также называется приведением типа данных. Например, если значение 2 назначено переменной с типом данных Boolean, значение 2 преобразуется в значение true типа данных Boolean перед его назначением переменной. Явное преобразование, которое также называется явным приведением, происходит в тех случаях, когда программный код запрашивает, чтобы компилятор переменную одного типа данных обработал как переменную другого типа. Если используются примитивные значения, явное приведение преобразует значения из одного типа данных в другой. Для явного приведения объекта к другому типу имя этого объекта заключают в круглые скобки и предваряют именем нового типа. Например, в следующем программном коде берется логическое значение и явным образом приводится к целому числу.

var myBoolean:Boolean = true; 
var myINT:int = int(myBoolean); 
trace(myINT); // 1

Неявные преобразования

Неявные преобразования происходят при выполнении программ в ряде следующих случаев.

  • В инструкциях присваивания

  • Если значения передаются как аргументы функции

  • Если значения возвращаются из функции

  • В выражениях, использующих определенные операторы, например оператор добавления (+)

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

    class A {} 
    class B extends A {} 
     
    var objA:A = new A(); 
    var objB:B = new B(); 
    var arr:Array = new Array(); 
     
    objA = objB; // Conversion succeeds. 
    objB = arr; // Conversion fails.

    Для примитивных типов неявные преобразования обрабатываются путем вызова тех же внутренних алгоритмов преобразования, которые вызываются функциями явного преобразования.

Явные преобразования

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

var quantityField:String = "3"; 
var quantity:int = quantityField; // compile time error in strict mode

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

var quantityField:String = "3"; 
var quantity:int = int(quantityField); // Explicit conversion succeeds.

Явное приведение в int, uint и Number

Можно выполнять явное приведение любого типа данных в один из трех числовых типов: int, uint и Number. Если преобразование числа невозможно по ряду причин, значение по умолчанию, равное 0, назначается типам данных int и uint, а также типу данных Number назначается значение по умолчанию NaN. Если происходит преобразование логического значения в числовое, то true становится значением 1, а false значением 0.

var myBoolean:Boolean = true; 
var myUINT:uint = uint(myBoolean); 
var myINT:int = int(myBoolean); 
var myNum:Number = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 1 1 1 
myBoolean = false; 
myUINT = uint(myBoolean); 
myINT = int(myBoolean); 
myNum = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 0 0 0

Строковые значения, содержащие только числа, могут быть успешно преобразованы в один из цифровых типов. В числовые типы также можно преобразовывать строки, которые похожи на отрицательные значения, или строки, отображающие шестнадцатеричные значения (например, 0x1A). В процессе преобразования отбрасываются предшествующий или завершающий символы пробелов в строковых значениях. Также можно выполнить явное приведение строк, которые напоминают числа с плавающей точкой, используя тип данных Number(). Включение десятичной точки заставляет значения с типом uint() и int() возвращать целое значение, отбрасывая десятичную часть и следующие за ней символы. Например, следующие строковые значения могут быть явным образом приведены в числа.

trace(uint("5")); // 5 
trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE 
trace(uint(" 27 ")); // 27 
trace(uint("3.7")); // 3 
trace(int("3.7")); // 3 
trace(int("0x1A")); // 26 
trace(Number("3.7")); // 3.7

При сохранении значений, содержащих нечисловые символы, возвращается 0, если выполнялось явное приведение в int() или uint(), а также NaN, если выполнялось явное приведение в Number(). В процессе преобразования предшествующие или завершающие пробелы отбрасываются, но возвращается 0 или NaN, если строка содержит пробел, разделяющий два числа.

trace(uint("5a")); // 0 
trace(uint("ten")); // 0 
trace(uint("17 63")); // 0

В ActionScript 3.0 функция Number() больше не поддерживает восьмеричные (имеющие основание 8) числа. Если передается строка, начинающаяся с 0 в функцию Number() ActionScript 2.0, это число интерпретируется как восьмеричное и преобразуется в свой десятеричный эквивалент. Это изменилось в функции Number() в ActionScript 3.0, которая просто отбрасывает первый ноль. Например, в следующем программном коде создаются разные выходные данные при компиляции в разных версиях ActionScript.

trace(Number("044"));  
// ActionScript 3.0 44 
// ActionScript 2.0 36

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

var myUInt:uint = -3; // Assign int/Number value to uint variable 
trace(myUInt); // 4294967293 
 
var myNum:Number = sampleUINT; // Assign int/uint value to Number variable 
trace(myNum) // 4294967293 
 
var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable 
trace(myInt); // 0 
 
myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable 
trace(myInt); // -2147483648

В следующей таблице резюмированы результаты явного приведения в типы Number, int или uint из других типов данных.

Тип данных или значение

Результат преобразования в Number, int или uint

Boolean

Если значение равно true, преобразуется в 1; иначе — в 0.

Date

Внутреннее представление объекта Date, показывающее число миллисекунд, которые прошли начиная с полуночи 1 января 1970 года, универсальное время.

null

0

Объект

Если значение экземпляра - null, и он преобразуется в Number, получается значение NaN; иначе получается значение 0.

String

Число, если строку можно преобразовать в число; в противном случае значение NaN при преобразовании в Number или 0 при преобразовании в int или uint.

undefined

Если преобразуется в Number, получается NaN; если преобразуется в int или uint — 0.

Явное приведение в Boolean

Явное приведение в Boolean из любого числового типа данных (uint, int и Number) дает значение false, если числовое значение равно 0, и true в остальных случаях. Для типа данных Number значение NaN также преобразуется в false. В следующем примере показаны результаты явного приведения чисел -1, 0 и 1.

var myNum:Number; 
for (myNum = -1; myNum<2; myNum++) 
{ 
    trace("Boolean(" + myNum +") is " + Boolean(myNum)); 
}

В результирующих данных примера показано, что из трех чисел только для 0 было возвращено значение false.

Boolean(-1) is true 
Boolean(0) is false 
Boolean(1) is true

Явное приведение в Boolean из значения String возвращает false, если значение строки null или это пустая строка (""). Во всех остальных случаях возвращается значение true.

var str1:String; // Uninitialized string is null. 
trace(Boolean(str1)); // false 
 
var str2:String = ""; // empty string 
trace(Boolean(str2)); // false 
 
var str3:String = " "; // white space only 
trace(Boolean(str3)); // true

Явное приведение в Boolean экземпляра класса Object возвращает false, если значение экземпляра null; в остальных случаях возвращается значение true:

var myObj:Object; // Uninitialized object is null. 
trace(Boolean(myObj)); // false 
 
myObj = new Object(); // instantiate  
trace(Boolean(myObj)); // true

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

var myObj:Object = new Object(); // instantiate  
var bool:Boolean = myObj; 
trace(bool); // true 
bool = "random string"; 
trace(bool); // true 
bool = new Array(); 
trace(bool); // true 
bool = NaN; 
trace(bool); // false

В следующей таблице резюмированы результаты явного приведения в типы Boolean из других типов данных.

Тип данных или значение

Результат преобразования в Boolean

String

false, если значение null или пустая строка (""); true во всех остальных случаях.

null

false

Number, int или uint

false, если значение NaN или 0; true во всех остальных случаях.

Объект

false, если значение экземпляра null; true во всех остальных случаях.

Явное приведение в String

Явное приведение к типу данных String из любого числового типа данных возвращает строку, отображающую данное число. Явное приведение к типу данных String логического значения (Boolean) возвращает строку "true", если значение true; возвращает строку "false", если значение false.

Явное приведение типа данных String из значения экземпляра класса Object возвращает строку "null", если значение этого экземпляра null. В остальных случаях явное приведение типа String из значения класса Object возвращает строку "[object Object]".

Явное приведение в String из экземпляра класса Array возвращает строку, состоящую из разделенного запятыми списка всех элементов этого массива. Например, в следующем явном приведении к типу данных String возвращается одна строка, содержащая все три элемента массива.

var myArray:Array = ["primary", "secondary", "tertiary"]; 
trace(String(myArray)); // primary,secondary,tertiary

Явное приведение к типу String из экземпляра класса Date возвращает строчное представление даты, содержащейся в данном экземпляре. Например, в следующем примере возвращается строчное представление экземпляра класса Date (на выходе показан результат для тихоокеанского летнего времени).

var myDate:Date = new Date(2005,6,1); 
trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005

В следующей таблице резюмированы результаты явного приведения в типы String из других типов данных.

Тип данных или значение

Результат преобразования в String

Массив

Строка состоит из всех элементов массива.

Boolean

true или false

Date

Строка, отображающая объект Date.

null

"null"

Number, int или uint

Строчное представление данного числа.

Объект

Если значение экземпляра null, возвращает "null"; во всех остальных случаях "[object Object]".