UID作为Flex的唯一标识,很多对象中都拥有mx_internal_uid属性,先看看代码:
方案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。
[color=blue]总结:
1. 对象 + ""和对象.toString()的唯一标识是相同的。
2. 对象在被引用和引用中的唯一标识都是相同的。
3. 数字在任何地方的使用对其唯一标识都是相同的。(2和2.00相同)
4. null和undefined在唯一标识上都是"null"。
5. ObjectUtil.clone方法不会克隆没有唯一标识的对象。
6. UIDUtil.getUID会为对象自动装配唯一标识。
7. 对象在没有唯一标识的情况下被ObjectUtil.copy会生成两个不同的唯一标识对象。
8. 反之,对象在有唯一标识的情况下被ObjectUtil.copy生成的对象也有相同的唯一标识。[/color]
<?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。
[color=blue]总结:
1. 对象 + ""和对象.toString()的唯一标识是相同的。
2. 对象在被引用和引用中的唯一标识都是相同的。
3. 数字在任何地方的使用对其唯一标识都是相同的。(2和2.00相同)
4. null和undefined在唯一标识上都是"null"。
5. ObjectUtil.clone方法不会克隆没有唯一标识的对象。
6. UIDUtil.getUID会为对象自动装配唯一标识。
7. 对象在没有唯一标识的情况下被ObjectUtil.copy会生成两个不同的唯一标识对象。
8. 反之,对象在有唯一标识的情况下被ObjectUtil.copy生成的对象也有相同的唯一标识。[/color]