В ECMAScript языках (AS1-3, JavaScript и др.), При использовании
var foo = //some value which is not a String or a Number
то, что вы действительно говорят «Foo теперь указывает на тот же объект, как тот другой переменной.» Это означает, что в этой ситуации, оба массива будут иметь то же значение:
var foo:Array = [ 1, 2, 3 ];
foo = bar;
bar.push(4);
trace(foo); // 1, 2, 3, 4
Это также работает для функций:
var foo:Array = [ 1, 2, 3 ];
adder(foo);
function adder(bar:Array):void {
bar.push(4);
}
trace(foo); // 1, 2, 3, 4
и он даже работает с XML:
var xml:XML = <root><foo/></root>;
var bar:XML = xml;
bar.children()[ 0 ][email protected] = 1;
trace(xml.toXMLString()); // <root><foo bar="1"/></root>
Этот называется «передача по ссылке» вместо «передача по значению» или «передача по копии». Это означает, что каждый раз, когда объект ссылается, каждая переменная указывает на тот же объект.
Существует множество способов обойти это, и большинство из них зависит от вашего контекста. Для массивов моим любимым является Array.concat(), который возвращает литеральный клон массива. Это означает, что все, что я делаю с возвращенным значением, никак не повлияет на оригинал. Однако, если я имею дело с XML, я сделаю что-то вроде: var xml2:XML = XML(xml.toXMLString());
.
В вашем случае, я бы на самом деле рекомендуем использовать:
var secondAC:ArrayCollection = new ArrayCollection(firstAC.source.concat());
Это основные преимущества не только быть быстрее (это зависит от скомпилированного кода вместо Flex SDK кода, и это также не первый создать экземпляр нового массива, а затем повторно заполнить его), но он также имеет явное преимущество в более ранних версиях SDK Flex 3 - он полностью обратно совместим.
Большое спасибо за этот ответ, очень приятные примеры ... thanx для вашего времени! Ladislav – Ladislav