`
pizazz_ex
  • 浏览: 20197 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

浅谈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生成的对象也有相同的唯一标识。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics