在ActionScript 3中,当我尝试查找类似[int,int]的内容时,似乎indexOf
无效。
例如:
var array:Array = new Array();
array.push([5, 6]);
trace(array.indexOf([5, 6])); //-1
我想知道我在这里遗失了什么。
答案 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