`
kino
  • 浏览: 103044 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

as3备忘六-数据类型(类型检查)

    博客分类:
  • flex
阅读更多

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 ,转载请注明,谢谢。

3
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics