level 9
flkuangren
楼主
本文将以 AS3 equals 基本特性的测试开始, 但并不仅仅停留这一层面, 我会将问题引向更深的层次. 如果你有不同的见解或是我有错误之处, 请不吝指教.
我们知道AS3有两个自带的 map 类数据容器: Object, Dictionary.
Object 的 key 只支持 int(或是Number, 下面统一称为int) 和 String.
Dictionary 的 key 可以支持任意类型的 Object, 但是有一个特殊声明: 内部用 === 来判断两个key是否 equals.
为了方便讨论: 两个对象的内容完全一样, 但 不==(===) 时, 我称之为, 不支持 ==(===)
除了int, String和XML(注意:XML不支持===) 这三种数据类型外, 用户无法自定义 ==, 更无法自定义 ===
运行下面的例子, print全部是 falseprivate function testOtherEquals():void {
var obj1:Object = new Object();
var obj2:Object = new Object();
trace("obj1==obj2 ? " + (obj1 == obj2));// print false
trace("obj1===obj2 ? " + (obj1 === obj2));// print false
var ary1:Array = new Array();
var ary2:Array = new Array();
trace("ary1==ary2 ? " + (ary1 == ary2));// print false
trace("ary1===ary2 ? " + (ary1 === ary2));// print false
var myo1:MyClass = new MyClass();
var myo2:MyClass = new MyClass();
trace("myo1==myo2 ? " + (myo1 == myo2));// print false
trace("myo1===myo2 ? " + (myo1 === myo2));// print false
var xml1:XML = <a></a>;
var xml2:XML = <a></a>;
//trace("xml1==xml2 ? " + (xml1 == xml2));// !! 该行 print true
trace("xml1===xml2 ? " + (xml1 === xml2));// print false
}
由此可见 Dictionary号称支持 Object为 key, 但实际上这是一个假象!! 因为你无法实现他的要求, ===
也许你的业务没有这么多的特定需求, 没有遇到过上面的这些情况, 但是完全可能会要将 XML(XMLList) 作为 map 的 key.
此时你没有选择只能用 Dictionary, 但问题是 XML(XMLList) 又不支持 ===, 看来这个问题是一个很要命的问题, 因为XML(XMLList)是AS3中很常见的数据类型.
好在, AS3有一种机制可以缓解这个问题, 那就是 reference, 对于 reference 天然是 === 的.
将上面的代码改写成一下, print 全都是 true了private function testRefernceEquals():void {
var myo1:MyClass = new MyClass();
var myo2:MyClass = myo1;
trace("myo1==myo2 ? " + (myo1 == myo2));
trace("myo1===myo2 ? " + (myo1 === myo2));
var xml1:XML = <a></a>;
var xml2:XML = xml1;
//trace("xml1==xml2 ? " + (xml1 == xml2));// XML ==
trace("xml1===xml2 ? " + (xml1 === xml2));
}
看来用 reference 来解决 不能自定义 equals 的问题, 是一个不错的主意, 但是AS3语言使用者就需要承担一个难的任务: 必须保证 只要是 一个业务对象, 就只能有一个 AS3 instance(object). 不能new 多个 AS3 Object, 实际却是一样的业务体.
但有时候你根本保证不了上面这一点!! (不是所有的代码从头到尾都是你一个人写呀!!)
除了application developer保证不了 "one bussiness object only one AS3 object". XMLList这个对象, 更是让AS3从自身就已经出现了问题:
XMLList类, 在 ==和===方面表现和 XML是一样的, 但他还有自身的特殊性:
下面的例子, 展示了: 同一个 XMLList AS3 Object的 children()不同次的调用返回, 是不同的AS3 XMLList 对象:private function testXMLChildEquals():void {
var a:XML = <a><d>hello</d></a>;
2011年10月17日 09点10分
1
我们知道AS3有两个自带的 map 类数据容器: Object, Dictionary.
Object 的 key 只支持 int(或是Number, 下面统一称为int) 和 String.
Dictionary 的 key 可以支持任意类型的 Object, 但是有一个特殊声明: 内部用 === 来判断两个key是否 equals.
为了方便讨论: 两个对象的内容完全一样, 但 不==(===) 时, 我称之为, 不支持 ==(===)
除了int, String和XML(注意:XML不支持===) 这三种数据类型外, 用户无法自定义 ==, 更无法自定义 ===
运行下面的例子, print全部是 falseprivate function testOtherEquals():void {
var obj1:Object = new Object();
var obj2:Object = new Object();
trace("obj1==obj2 ? " + (obj1 == obj2));// print false
trace("obj1===obj2 ? " + (obj1 === obj2));// print false
var ary1:Array = new Array();
var ary2:Array = new Array();
trace("ary1==ary2 ? " + (ary1 == ary2));// print false
trace("ary1===ary2 ? " + (ary1 === ary2));// print false
var myo1:MyClass = new MyClass();
var myo2:MyClass = new MyClass();
trace("myo1==myo2 ? " + (myo1 == myo2));// print false
trace("myo1===myo2 ? " + (myo1 === myo2));// print false
var xml1:XML = <a></a>;
var xml2:XML = <a></a>;
//trace("xml1==xml2 ? " + (xml1 == xml2));// !! 该行 print true
trace("xml1===xml2 ? " + (xml1 === xml2));// print false
}
由此可见 Dictionary号称支持 Object为 key, 但实际上这是一个假象!! 因为你无法实现他的要求, ===
也许你的业务没有这么多的特定需求, 没有遇到过上面的这些情况, 但是完全可能会要将 XML(XMLList) 作为 map 的 key.
此时你没有选择只能用 Dictionary, 但问题是 XML(XMLList) 又不支持 ===, 看来这个问题是一个很要命的问题, 因为XML(XMLList)是AS3中很常见的数据类型.
好在, AS3有一种机制可以缓解这个问题, 那就是 reference, 对于 reference 天然是 === 的.
将上面的代码改写成一下, print 全都是 true了private function testRefernceEquals():void {
var myo1:MyClass = new MyClass();
var myo2:MyClass = myo1;
trace("myo1==myo2 ? " + (myo1 == myo2));
trace("myo1===myo2 ? " + (myo1 === myo2));
var xml1:XML = <a></a>;
var xml2:XML = xml1;
//trace("xml1==xml2 ? " + (xml1 == xml2));// XML ==
trace("xml1===xml2 ? " + (xml1 === xml2));
}
看来用 reference 来解决 不能自定义 equals 的问题, 是一个不错的主意, 但是AS3语言使用者就需要承担一个难的任务: 必须保证 只要是 一个业务对象, 就只能有一个 AS3 instance(object). 不能new 多个 AS3 Object, 实际却是一样的业务体.
但有时候你根本保证不了上面这一点!! (不是所有的代码从头到尾都是你一个人写呀!!)
除了application developer保证不了 "one bussiness object only one AS3 object". XMLList这个对象, 更是让AS3从自身就已经出现了问题:
XMLList类, 在 ==和===方面表现和 XML是一样的, 但他还有自身的特殊性:
下面的例子, 展示了: 同一个 XMLList AS3 Object的 children()不同次的调用返回, 是不同的AS3 XMLList 对象:private function testXMLChildEquals():void {
var a:XML = <a><d>hello</d></a>;