我如何评估我的测试数组是否等于我的静态常量DEFAULT_ARRAY?我的输出不应该返回true吗?
public class myClass extends Sprite
{
private static const DEFAULT_ARRAY:Array = new Array(1, 2, 3);
public function myClass()
{
var test:Array = new Array(1, 2, 3);
trace (test == DEFAULT_ARRAY);
}
//traces false
最佳答案
马克已经指出了问题所在。 ==
运算符将告诉您(对于引用类型,例如Array对象)两个变量是否指向同一个对象。显然这里不是这样。您有2个不同的对象,碰巧具有相同的内容。
因此,您可能正在寻找一种比较2个数组是否具有相同内容的方法。这个看似简单的任务可能比看起来要棘手。
标准方法是使用类似以下的功能:
function areEqual(a:Array,b:Array):Boolean {
if(a.length != b.length) {
return false;
}
var len:int = a.length;
for(var i:int = 0; i < len; i++) {
if(a[i] !== b[i]) {
return false;
}
}
return true;
}
这在某些(可以说是大多数)情况下将起作用。但是,如果任何数组中的项具有引用类型语义(与值类型语义相对),则将失败。基本上,数字(包括ints和uint),Strings,Boolean,null和undefined具有值类型语义:
鉴于:
var a:int = 0;
var b:int = 0;
这将成立:
trace(a == b);
对于其他所有内容,仅当两个var引用同一个对象时,与
==
进行比较才会返回true:var a:Object = {data:1};
var b:Object = {data:1};
trace(a == b); // false
但
var a:Object = {data:1};
var b:Object = a;
trace(a == b); // true
因此,如果您的数组包含对象(或依次包含其他数组),则在这种情况下areEqual将失败:
var arr_1:Array = [{data:1}];
var arr_2:Array = [{data:1}];
trace(areEqual(arr_1,arr_2));
为什么?因为您存储在
{data:1}
中的arr_1
对象与{data:1}
中存储的arr_2
对象不同。我认为不可能创建一个通用函数来递归检查两个数组的内容是否相等,因为没有通用的方式可以确定两个对象是否应该相等。这实际上取决于您的对象,域等。在您的应用中,如果两个对象具有相同的
ìd
(假设您已定义ìd
属性),则应将它们视为相等。正如我认为的那样,没有办法事先知道使对象相等的原因。
关于actionscript-3 - ActionScript比较数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2890178/