1、as3会进行类型检查,看数据类型是否匹配。
2、数据类型不匹配的几种情况
- 声明了一个变量的类型,但是赋给它非此类型的值:
var num:Number; num = "str';
- 声明的参数类型和参数值不同:
function test(p:String):void{} test(3);
3、何时检查? 可以在编译时检查,也可以在运行时检查。编译分为两种模式,严格模式和标准模式。严格模式会在编译时执行类型检查,标准模式则不会;但两种模式都会在运行时检查。
4、严格模式下退出类型检查。 在严格模式下也可以避免进行类型检查,通过使用无类型变量。
例一:
function test1(p):void{
trace(p);
}
var a:Number = 10;
var b:String = "Hello";
test1(a);
test1(b);
例二:
function test2(p:String):void{
trace(p);
}
var a:* = 10
test2(a);
在例一和例二中,编译时都不会报错。因为,例一中,函数test1的参数声明为无类型的,它就可以接收任何类型的参数;例二中,虽然函数test2的参数类型为字符串,但我们传进去的参数为无类型的。
但是例二中会产生运行时错误,因为到运行时就会发现传进的参数是数字型的,和声明的参数类型不匹配。
5、 使用标准模式编译,实际上是把类型检查推迟到运行时进行,这样可以实现类的“上传”功能。
//定义
class ClassA extends ClassB{
var name:String;
}
//调用
var some:ClassB = new ClassA();
some.name="some";
如上,我们定义了ClassA,它继承自ClassB。ClassA定义了自己的一个属性name。在接下来的调用中,我们声明了一个ClassB类型的变量some,但我们赋给它了一个ClassA的实例,这是合法的,这就叫做“上传”。但接下来,我们给some的属性name赋值,但属性name并不属于ClassB,如果在严格模式下就会产生编译错误,但不会产生运行时错误。
6、is运算符。 用于测试变量或表达式是否为给定数据类型的成员,返回true或false。
假设:
- 存在类A
- 类A继承类B
- 类A实现接口IM
- 类B继承类C
- 类C实现接口IN
有:
var a:A=new A();
a is A; //true
a is B; //true
a is C; //true
a is IM; //true
a is IN; //true
//B、C为A的父类,IM、IN为A实现的接口
上面的每个表达式都为true;
和instanceof的不同,将is换成instance:
var a:A=new A();
a instanceof A; //true
a instanceof B; //true
a instanceof C; //true
a instanceof IM; //false
a instanceof IN; //false
//B、C为A的父类,IM、IN为A实现的接口
可以看到后两项为false,可以看出两者的不同:is可以检查接口,instance不能,所以我们应该用is
7、as运算符。功能和is一样,唯一的区别就是返回值,is返回true时,as返回测试的对象或表达式,is返回false,as返回null.
var a:A=new A();
a as A; //返回对象a
a as B; //返回对象a
a as C; //返回对象a
a as IM; //返回对象a
a as IN; //返回对象a
a as XX; //返回null
//B、C为A的父类,IM、IN为A实现的接口
本文地址:http://kino.iteye.com/blog/236381 ,转载请注明,谢谢。