0

当我从我的一个数组拼接一个条目时,它会从我的另一个数组拼接相同的条目......发生了什么?

        private static var words:Array = new WordFile().toString().split(/\n/);
        private static var wordsTemp:Array;

public static function checkWord (word:String):Boolean
    {
var truefalse:Boolean = wordsTemp.indexOf(word+"\r".toLowerCase()) > -1;
                trace (words.length)

                wordsTemp.splice(wordsTemp.indexOf(word+"\r".toLowerCase()), 1);

                trace (words.length)
   return truefalse

}
public static function resetArrays :void
{
wordsTemp = words
}

使用这段代码,我每次开始新游戏时都会调用 resetArrays 函数。进入游戏后,程序将调用 checkWord 并传递一个单词。如果在单词数组中找到,就会从临时数组中拼接出来。但是,当我运行它时,两条迹线会产生 2 个不同的数字,而第二个则低一个(假设在数组中找到了该词)。这在我看来很奇怪,因为我正在拼接要重置的临时数组,但是在跟踪应该不变的数组时(除了我向您展示的操作之外,没有其他操作)似乎由临时数组中的拼接更改...

有什么想法吗?

4

3 回答 3

1

在 AS3 中,除String和(以及相关)之外的所有数据类型都通过引用Number复制

这意味着它仅在您使用时复制对原始对象的引用myArray1 = myArray2

更详细地说,考虑存储的内存words0x123456

wordsTemp = wordswordsTemp指向相同的内存,即 0x123456

对 进行任何操作时words,会修改 0x123456 处的数组。但这就是wordsTemp所指的。所以实际上两者都是同一个对象。为了使两者不同,您需要克隆对象。如果是数组,您可以使用任何修改数组并返回新数组的方法来克隆它,例如Array.slice

wordsTemp=words.slice(0, words.length); //will do the trick

或者,您可以不将任何内容连接到原始数组并获得副本

wordsTemp=words.concat();

或者,如果您想编写更多代码行,您可以执行以下操作:

wordsTemp=new Array();
for (var i:int=0; i<words.length; i++) {
    wordsTemp.push(words[i]);
}
于 2012-06-05T04:07:25.237 回答
0

当您执行 wordsTemp = words 时,您不只是分配数组项,而是分配程序中的内存空间。您必须将所有项目从第一个数组复制到第二个,但不要将其设置为相等。

您可以执行循环以将所有项目从 words 复制到 wordsTemp 或执行以下操作:

wordsTemp = words.slice(0, words.length);

它将返回原始数组的副本而不修改它可以提供帮助的跳

于 2012-06-05T02:36:18.217 回答
0

据我所知,在 AS3 中克隆数组的最简单和“标准”的方法是:

var cloneArray:Array = sourceArray.concat();
于 2012-06-05T04:54:05.560 回答