Особенности операции присваивания

Что произойдет, если одной переменной будет присвоено значение другой? Ответ на поставленный вопрос совсем не очевиден. С одной стороны, если переменная представляет собой ссылку на некоторый участок памяти, хранящий данные, то ее присваивание другой переменной должно означать копирование этой ссылки. Следовательно, после проведения операции присваивания две переменные будут указывать на один объект данных. С другой стороны, присваивание вполне может сопровождаться копированием объекта данных. Какой из этих сценаиев реализуется в ActionScript? Правильный ответ — оба. Если значение присваиваемой переменной является объектом данных элементарного типа, то происходит его копирование. Послеэтого физически в памяти содержатся уже два аналогичных и абсолютно не связанных значения — индивидуальное для каждой переменной.

var a: String = "Привет";
var b: String = а;
а += "!!!"; // Изменяем а: если переменная b является ссылкой на тот же
// объект, изменится и ее значение
trace(а); // Выводит: Привет!!!
trace(b); // Выводит: Привет (Следствие: b ссылается на иной объект
// данных, чем а)

Копирование объекта данных элементарного типа при присвоении одной переменной другой оправданно, так как иначе было бы весьма проблематично написать даже очень простой алгоритм — слишком сильно были бы «завязаны» величины друг на друге.


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

var a:Object = {property:1}; // Переменная хранит объект со свойством
// property=1
var b:Object = а;
// Меняем свойство property: если а и b ссылаются на один объект данных, то
// b возвратит новое значение
a.property=2;
trace(b.property); // Выводит: 2 (объект данных был изменен)

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

«А что делать, — спросите вы, — если переменной необходимо передать именно индивидуальный объект данных?» Решений этой задачи можно найти много, в зависимости от типа объекта данных.

В наиболее общем случае можно создать собственный класс и использовать затем его функцию-конструктор.


Если объектом данных является массив, то на помощь может прийти функция split().

Размножить клип можно, применив методы attachMovie() или duplicateMovieClip(). В общем, трудности, вызываемые особенностями операции присваивания для переменной с составным значением, легко решаемы.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Action Script на эту тему:
Есть ли переменные в ActionScript?
Локальные переменные функций
Особенности типизации переменных
Создание переменных
Удаление переменных

Вернуться в раздел: Action Script / 3. Переменные