当我从我的一个数组中拼接一个条目时,它从我的另一个数组拼接相同的条目......发生了什么?
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个跟踪产生2个不同的数字,第二个产生一个较低的数字(假设在数组中找到了该字)。这在我看来是非常奇怪的,因为我正在拼接重置的临时数组,但是当跟踪应该没有更改的数组时(除了我用它显示的那些操作之外没有其他操作)它似乎要通过临时数组中的拼接进行更改...
有什么想法吗?
答案 0 :(得分:1)
在AS3中,除String
和Number
(及相关)之外的所有数据类型都通过引用复制
这意味着它只在您使用myArray1 = myArray2
更详细地说,请考虑words
存储的内存为0x123456
wordsTemp = words
会使wordsTemp
指向相同的内存,即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]);
}
答案 1 :(得分:0)
当你使用wordsTemp = words时,你不只是分配数组项,而是分配程序中的内存空间。您必须将所有项目从第一个数组复制到第二个数组,但不要将它设置为相等。
您可以循环将所有项目从单词复制到wordsTemp或执行以下操作:
wordsTemp = words.slice(0, words.length);
它将返回原始数组的副本而不进行修改 可以帮助的跳跃
答案 2 :(得分:0)
据我所知,最简单的&#34;标准&#34;在AS3中克隆数组的方法是:
var cloneArray:Array = sourceArray.concat();