IndexOf()不起作用

时间:2014-05-25 20:33:02

标签: arrays actionscript-3

在ActionScript 3中,当我尝试查找类似[int,int]的内容时,似乎indexOf无效。

例如:

var array:Array = new Array();
array.push([5, 6]);
trace(array.indexOf([5, 6])); //-1

我想知道我在这里遗失了什么。

2 个答案:

答案 0 :(得分:2)

与AS3中的所有非基本类型一样,数组由引用检查,而不是由值检查。每当您创建对象的新实例(如数组)时,该变量实际上是指向对象所在的内存中的位置的指针。

出于这个原因,您的代码无法正常工作,因为您需要将指针与两个不同的数组进行比较。语言不知道(或关心)对象的内容,所有它想要比较的是两个对象的内存位置(即引用)。

如果我们查看您的代码:

var array:Array = new Array();/
array.push([5, 6]);
trace(array.indexOf([5, 6])); //-1

您实际上是在声明三个不同的数组,每个数组在内存中都有自己的位置。首先你创建数组var,然后在这个上推一个新数组,然后在这个中你尝试搜索一个新数组(在indexOf([5,6]中)你要在线声明一个新数组)。因此,搜索返回false,因为引用不匹配 - 即使数组的内容也是如此。

var array:Array = new Array();
var subArray:Array = [5, 6];
array.push(subArray);
trace(array.indexOf(subArray)); // 0

...这是有效的,因为对数组的引用匹配。

原始类型 - 数值,布尔值,字符串,按值进行比较,例如

var a:int = 10; var b:int = 10; trace(a == b);//True

其中引用类型不是:

var a:Array = [5]; var b:Array = [5]; trace(a == b);//False

玩家在声明两个不同物体的所有属性之前比较它们是相当费时的。与否(因为大多数复杂数据类型没有与数字相同的方式具有不同的值),因此对于任何非原始数据,查找和比较都是通过引用完成的。

希望这有帮助。

答案 1 :(得分:1)

每次撰写[5, 6]时,您都会创建[int, int]的新实例。在执行indexOf()并比较对象时,它仅检查数组中是否存在该特定实例(通过检查对象的引用),而不是具有相同值的另一个实例。您可以按照以下方式更改代码,因为它按预期工作:

var arr0:Array = [5, 6];
var array:Array = new Array(); 
array.push(arr0); 
trace(array.indexOf(arr0)); //should print 0 now instead of -1