The*_*978 4 arrays compare actionscript-3
我如何评估我的测试数组是否等于我的静态常量DEFAULT_ARRAY?我的输出不应该返回真实吗?
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
Run Code Online (Sandbox Code Playgroud)
麦克已经指出了这个问题.==如果两个变量指向同一个对象,操作员将告诉您(对于诸如Array对象的引用类型).这显然不是这里的情况.您有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;
}
Run Code Online (Sandbox Code Playgroud)
这将适用于一些(可以说是大多数)案例.但是如果任何数组中的项具有引用类型语义(与值类型语义相反),它将失败.基本上,Numbers(包括int和uint),Strings,Boolean,null和undefined都有值类型语义:
鉴于:
var a:int = 0;
var b:int = 0;
Run Code Online (Sandbox Code Playgroud)
这将成立:
trace(a == b);
Run Code Online (Sandbox Code Playgroud)
对于其他所有内容,==如果两个vars引用同一个对象,则只会返回true:
var a:Object = {data:1};
var b:Object = {data:1};
trace(a == b); // false
Run Code Online (Sandbox Code Playgroud)
但
var a:Object = {data:1};
var b:Object = a;
trace(a == b); // true
Run Code Online (Sandbox Code Playgroud)
因此,如果您的数组包含对象(或者反过来包含其他数组),则在这种情况下,areEqual将失败:
var arr_1:Array = [{data:1}];
var arr_2:Array = [{data:1}];
trace(areEqual(arr_1,arr_2));
Run Code Online (Sandbox Code Playgroud)
为什么?因为{data:1}您存储arr_1的{data:1}对象与存储的对象不同arr_2.
我认为不可能创建一个通用函数来递归检查两个数组的内容是否相等,因为没有通用的方法来确定两个对象是否应该被认为是相等的.这实际上取决于您的对象,您的域等.即使您的应用程序中,如果它们具有相同的两个对象ìd(假设您已定义ìd属性),则应视为相等.正如我认为的那样,没有办法事先知道是什么让对象变得平等.