X

AS3的类型转换

都说C/C++的类型转换个很头疼的问题。我说AS3的类型转换也简单不了多少(后者相比前者肯定简单些,呵呵)。

何为类型转换

当操作数的类型不同时,需要将一种类型转换为另一种类型,这就是类型转换。

类型转换分为显示类型转换隐式类型转换两种。

显示类型转换

又名强制类型转换,是开发者手动让一种数据类型转换为另一种数据类型。
这个比较容易理解,也比较容易掌握。

1) 使用Type(type)的类型转换。不一定能转换成功,失败则抛出异常。

var t:String = String(12);

2) 使用as操作符进行的类型转换。不一定能转换成功,失败则返回null。

var sp:Sprite;
var mc:MovieClip = sp as MovieClip;

3) 使用parseInt,parseFloat函数将String转换为数值。

var n:int = parseInt("12");
var num:Number = parseFloat("0.3");

4) 使用toString函数将任意类型(undefined和null除外)转换为String。

var n:int = 100;
var s:String = n.toString();

隐式类型转换

又名自动类型转换,是编译器或者runtime在做运算的时候自动将一种类型转换为另一种类型。
隐式类型转换分为好几种情况,有的是安全的,有的是不安全的。

1) 数值的类型提升(安全的),将int提升为Number,其实这个是有争议的,因为AS3里的数值内部用的都是Number,然后再将结果转换为响应的类型,这样也就不存在类型提升了。
2) 向上类型转换(安全的),子类向上转换为父类(直接或间接)。比如说MovieClip类型转换为Sprite类型。
3) 由赋值运算产生的类型转换仅限数值型(不安全)

var n:Number = int.MAX_VALUE + 1;
var t:int = n;
trace(n); // out put 2147483648
trace(t); // out put -2147483648

4) 动态类型赋值运算产生的类型转换。String->Number,Number->String这两个类型转换只有脚本语言里才有的。

var o:Object = { n:3, s:"3" };
var n:int = o.n;    // 这是数值
var s:String = o.s; // 这是String
trace(n); // out put 3
trace(s); // out put 3

5) 动态类型比较运算产生的类型转换。String->Number。这个是 ECMAScript 的11。9。3 The Abstract Equality Comparison Algorithm规定的,比较变态。

16.If Type(x) is Number and Type(y) is String,return the result of the comparison x == ToNumber(y)。
17.If Type(x) is String and Type(y) is Number,return the result of the comparison ToNumber(x) == y。

var o:Object = { a:"3", b:"" };
trace(o.a == 3); // out put true  这里可能是感觉是Number->String,其实不然
trace(o.b == 0); // out put true  这里会看到其实是String->Number, 0 == int("")

6) 加法运算产生的类型转换。能用数值运算就用数值运算,否则统统toString后再运算。

trace(1 + 2);        // 3
trace(1 + true);     // 2     1+int(true)
trace(true + false); // 1     int(true)+int(true)
trace(null + 1);     // 1     int(null)+1
trace(true + "1");   // true1 String(true)+"1"

结语

其实以上的类型转换只是AS3里类型转换的一小部分。还有很多都没有覆盖到,呵呵,以后有空了再写了。

This post was last modified on 2019 年 03 月 04 日 00:44

This website uses cookies.