ActionScript 2中,类型转换的语法为:type(item),例如下面我们将string转换为Number:
var str:String="1"; var i:Number=Number(1);
详细的类型转换(casting )语法请查看:About casting objects,该语法存在一些语言混淆的问题:
- 与其他语言如Java和C#的类型转换语法不一致
- 语法不明确 - 因为该类型转换看起来就象是调用构造器,这样的代码就不够清晰:究竟是您忘了new关键字了呢,还是您就是想进行类型转换处理呢?
- 转换函数优先 - ActionScript中有一些转换函数如:Array()、 Number()和Boolean(),因为这些转换函数的优先级高于类型转换操作,所以通常这样的情况我们就得不到我们预期的结果,因为转换函数的优先执行,将一个类型转换成数组类型的操作都不能实现。
为了避免以上问题,ActionScript 3引入了与类型转换行为类似的as操作符,该操作符的语法为:表达式 as 数据类型,该语法与C#中的as操作符类似,这样可以更好的帮助以后C#开发人员迁移到ActionScript 3中类。
as操作符使用很简单:
// getChildAt方法返回DisplayObject类型对象,但是 // 我要将其转换为Sprite,所以我们使用了as操作符 var s:Sprite = getChildAt(0) as Sprite;
类型转换与as操作符一个关键的不同是:转换失败时的处理。ActionScript 2中,类型转换失败将返回null,而在ActionScript 3中,将触发TypeError异常。而as操作符,如果转换失败的话,将返回目标数据类型的默认缺省值:
数据类型 | 缺省值 |
---|---|
Boolean | false |
int | 0 |
Number | NaN |
Object | undefined |
String | null |
uint | 0 |
未声明(默认为:Object) | undefined |
其他数据类型 | null |
示例如下:
var o:Object = "test"; trace( o as MovieClip ); // 显示: null trace ( MovieClip ( o ) ); // 产生TypeError
使用as替代类型转换其中一个非常好的优点是:现在使用as操作符您可以成功将其他类型的转换到数组类型了:
// 为了演示需要,将一个一般的Object初始化数组 var o:Object = [1, 2, 3]; // 试图将o转换为数组 - 非期待结果 // 因为数组转换函数优先被调用,我们未能得到我们期待的结果 var a:Array = Array( o ); // 数组转换函数创建了一个数组,该数组只有一个值为o的元素 trace( a.length ); // 输出: 1 // 确认其只有一个元素 (长度为3的数组) trace( a[0] ); // 输出: 3 // 访问o的第1个元素 trace( a[0][0] ); // 输出: 1 // 使用as关键字将o转换为数组,结果与我们期待的一致 var b:Array = o as Array; trace( b.length ); // 输出: 3 // 访问o的第1个元素 trace( b[0]); // 输出: 1
正是ActionScript 3的这些积极的改变,使得我们愈加享受用AS3工作的乐趣,虽然我不明白在(类型)表达式这种类似Java的类型转换语法更有优势的情况下(估计大家都倾向与Java语法吧!),为什么ActionScript 3选择了as 类型(表达式)这样的类型转换语法,但是至少,as操作符使得类型转转再次可以进入我们可容忍的范围。
转
http://blog.eshangrao.com/index.php/2006/02/17/202-flex2-actionscript-3