首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > flex >

浅谈Flex独一标识UID

2012-10-26 
浅谈Flex唯一标识UIDUID作为Flex的唯一标识,很多对象中都拥有mx_internal_uid属性,先看看代码:?xml versi

浅谈Flex唯一标识UID
UID作为Flex的唯一标识,很多对象中都拥有mx_internal_uid属性,先看看代码:

<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"    xmlns:s="library://ns.adobe.com/flex/spark"    xmlns:mx="library://ns.adobe.com/flex/mx"    minWidth="955" minHeight="600"><s:layout><s:VerticalLayout /></s:layout><fx:Script><![CDATA[import mx.controls.Alert;import mx.utils.ObjectUtil;import mx.utils.UIDUtil;private var _arr:Array = ["a", "b"];private var _obj:Object = {"a": "b"};private function infoA():void{alert(_arr + "", "a,b");}private function infoB():void{_arr.push(_obj);alert(_arr[2], _obj)}private function infoC():void{var u:Number = _arr.length - 1;_arr.pop();alert(_arr.length, u);alert(1, 1.00);}private function infoD():void{var _newArr:Array = _arr;var _oldArr:Array = _arr;_newArr.pop();alert(_newArr, _oldArr);alert(btn.stage, stage);}private function infoE():void{alert(null, undefined);}private function infoF():void{alert(ObjectUtil.clone(_arr), _arr);}private function infoG():void{//alert(ObjectUtil.copy(_arr), _arr);var _newArr:Object = ObjectUtil.copy(_arr);alert(_newArr, _arr);_arr.pop();alert(_newArr, _arr);alert(_newArr.length, _arr.length);}private function alert(oA:Object, oB:Object):void{var _strA:String = UIDUtil.getUID(oA);var _strB:String = UIDUtil.getUID(oB);Alert.show(_strA + "\n" + _strB + "\n" + (_strA == _strB));}]]></fx:Script><s:Button label="方案A" click="infoA()" /><s:Button label="方案B" click="infoB()" /><s:Button label="方案C" click="infoC()" /><s:Button label="方案D" click="infoD()" /><s:Button label="方案E" click="infoE()" /><s:Button label="方案F" click="infoF()" /><s:Button id="btn" label="方案G" click="infoG()" /></s:Application>


方案A中 结果返回true
_arr + ""和_arr.toString()从对比上讲是一个意思,因此两者的结果是相同的,明显的两个字符串的地址不一样,但通过判断返回true,说明两者的唯一标识相同。

方案B中 结果返回true
返回的结果说明 两个对象唯一标识相同 对象在数组中估计是引用而已。

方案C中 结果都是返回true
返回结果说明 数字类型的唯一标识是统一的,不管怎么变化,都是唯一的数字而已。

方案D中 结果返回true
引用相同,唯一标识相同。

方案E中 结果返回true
程序会将其强行转换为"null"字符串,那么其唯一标识就是"null"。

方案F中 如果首先选取这个方案,结果会先为false后为true,如果先前选择了以上方案,那么会直接为true
首先说明ObjectUtil.clone方法不会克隆没有唯一标志的对象,估计是在UIDUtil.getUID方法的时候为其装配了唯一标志,所以在第二次选取的时候,唯一标识就相同了。

方案G中 同方案F一样,需要第一次选取,其中有一段被注释掉了,取消注释则返回值为false true true false,如果注释代码则返回值为false false false
结果有点怪,估计是这样的,在取消注释时,_arr中是没有唯一标识的,从方案F可以大概证明,经过UIDUtil.getUID方法后,加入了唯一标识,因此在第二次拷贝时,由于唯一标识相同,而返回true,因为是对象拷贝,而且对象的唯一标识是相同的,但又因对象已经被分割成两个地址,所以最后判断为false;当注释代码后,由于其被拷贝的对象没有唯一标识,因而返回false,在ObjectUtil.copy之前对象唯一标识没有进行统一,所以第二次对比也为false,说明生成了不同的唯一标识,当然最后结果也为false。

总结:
1. 对象 + ""和对象.toString()的唯一标识是相同的。
2. 对象在被引用和引用中的唯一标识都是相同的。
3. 数字在任何地方的使用对其唯一标识都是相同的。(2和2.00相同)
4. null和undefined在唯一标识上都是"null"。
5. ObjectUtil.clone方法不会克隆没有唯一标识的对象。
6. UIDUtil.getUID会为对象自动装配唯一标识。
7. 对象在没有唯一标识的情况下被ObjectUtil.copy会生成两个不同的唯一标识对象。
8. 反之,对象在有唯一标识的情况下被ObjectUtil.copy生成的对象也有相同的唯一标识。

热点排行