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生成的对象也有相同的唯一标识。
分享到:
相关推荐
深入浅出Flex_Viewer.pdf
深入浅出Flex深入浅出Flex深入浅出Flex深入浅出Flex深入浅出Flex深入浅出Flex深入浅出Flex深入浅出Flex
MyEclipse+Flex+Blzeds入门浅谈.MyEclipse+Flex+Blzeds入门浅谈
Flex唯一中文教程,绝对经典,独家推荐!
深入浅出flex中文教程!!!!!!!!!!!!!!!!!!!!
flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图flex 地图...
FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效 FLEX特效FLEX特效FLEX特效FLEX特效
Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex Flex ...
flex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex 精通 flexflex学习的好资源啊
Flex简介Flex简介Flex简介Flex简介Flex简介
flex事件flex事件flex事件flex事件flex事件
《flex4.5从浅入深》第一(全16节)、二章(5节),清晰版
Flex 组件Flex 组件Flex 组件Flex 组件Flex 组件
java flexjava flexjava flex
Flex相册 Flex图片
Flex万年历记事本_flex源码
flex皮肤flex皮肤flex皮肤flex皮肤flex皮flex皮肤肤
flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式flex设计模式
flex 面试题flex 面试题flex面试题flex
flex画线flex画线flex画线flex画线