对一个变量的更改会传播到另一个变量

时间:2009-12-08 17:12:34

标签: flex reference

例如,我有两个ArrayCollection - firstAC和secondAC。如果我做secondAC = firstAC,而不是我对secondAC进行了更改(或许在它上面放了一个过滤器函数)它以某种方式传播到firstAC,有人会告诉我为什么会在Flex或Actionscript 3中发生这种情况吗?

如果我只想让secondAC从firstAC获取所有数据但是当我对secondAC进行更改时它不会在firstAC中显示,我该怎么办?

Thanxs一堆寻求答案! 拉吉斯拉夫

4 个答案:

答案 0 :(得分:5)

当您编写secondAC = firstAC时,您只需声明secondAC和firstAC是对同一数组集合的引用。

你想要的是克隆第一个集合(如同,逐个复制所有元素)。

你应该能够做到这样的事情:

secondAC = new ArrayCollection();
secondAC.addAll(firstAC); 

答案 1 :(得分:1)

我不知道Flex或Actionscript,但看起来firstAC和secondAC指向同一个数组,因此是预期的。

你应该做的只是创建另一个数组,复制成员,它们将是两个真正不同的实体。

答案 2 :(得分:1)

您可以尝试secondAC = firstAC

,而不是secondAC.addAll(firstAC)

答案 3 :(得分:0)

在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 ].@bar = 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代码,它也不首先实例化一个新数组,然后重新填充它),但它也有明显的好处在早期版本的Flex 3 SDK中可用 - 它完全向后兼容。