数据类型检查(is、as、typeof、in、instanceof)

来源:互联网 发布:电视看最新电影软件 编辑:程序博客网 时间:2024/06/06 01:55

2.5.12  数据类型检查(is、as、typeof、in、instanceof)

(1) is运算符

is运算符是ActionScript 3.0中的新增运算符,用来测试变量或表达式是否为给定的数据类型。is运算符检查正确的继承层次结构,不但能够检查对象是否为特定类的实例,而且还可以检查对象是否是用来实现特定接口的类的实例。早期版本中的instanceof运算符已不再使用。例如:

  1. var mySprite:Sprite = new Sprite();  
  2. trace(mySprite is Sprite); // true  
  3. trace(mySprite is DisplayObject); // true  
  4. trace(mySprite is IEventDispatcher); // true  

说明:创建一个Sprite类的名为mySprite的实例,使用is运算符来测试mySprite是否为Sprite和 DisplayObject类的实例,以及它是否实现了IEventDispatcher接口。

is运算符检查继承层次结构,并正确地报告mySprite是Sprite或DisplayObject的实例(Sprite类是 DisplayObject类的子类)。正确地报告mySprite实现IEventDispatcher接口(Sprite类是从实现IEventDispatcher 接口的EventDispatcher类继承的)。

早期版本中的instanceof运算符虽然能识别出mySprite是Sprite或DisplayObject的实例,但不能识别mySprite是否实现了IEventDispatcher接口。

(2) as运算符

as运算符是ActionScript 3.0中的新增运算符,也可用来检查表达式是否为给定数据类型。但是,与is运算符不同的是,as运算符不返回布尔值,而是返回表达式的值(代替true)或null(代替false)。在使用as运算符时,右侧的操作数必须是数据类型。如果尝试使用表达式(而非数据类型)作为右侧的操作数,将会产生错误。

例如:

  1. varmySprite:Sprite = new Sprite();  
  2. trace(mySprite as Sprite); // [Sprite对象]  
  3. trace(mySprite as DisplayObject); // [Sprite对象]  
  4. trace(mySprite as IEventDispatcher); // [Sprite对象]  
  5. trace(mySprite as Number); // null  

(3) typeof运算符

用法为typeof expression,计算表达式expression并返回其数据类型的字符串。结果限制在6个可能的字符串值:boolean、function、number、object、string和xml。如果向用户定义的类应用此运算符,则结果为字符串object。之所以包括typeof运算符是为了向后兼容。使用is运算符可以检查类型是否兼容。表2-17说明对各个类型的表达式使用typeof运算符的结果。

表2-17  typeof运算符

表达式类型

执行运算的结果

Array

object

Object

object

int

number

uint

number

Number

number

String

string

Boolean

boolean

Function

function

XML

xml

XMLList

xml

(4) in运算符

用法expression1 in expression2计算属性是否为特定对象的一部分。若使用in运算符,要将属性名指定为第一个操作数,并将对象指定为第二个操作数。如果expression1是由expression2表示的对象的属性,则值为true,否则为false。

例如:

  1. trace("PI" in Math); // true  
  2. trace("myProperty" in Math); // false  

如果指定的对象是Array对象,则可以使用in运算符来检查特定的索引编号是否有效。如果向第一个操作数传递整数,那么,当索引位于有效的索引编号范围内时,结果为true,否则为false。

例如:

  1. var myArray:Array = ["a", "b", "c"];  
  2. trace(0 in myArray); // 0 是 myArray 对象中的有效索引编号,返回true  
  3. trace(1 in myArray); // 1 是 myArray 对象中的有效索引编号,返回true  
  4. trace(2 in myArray); // 2 是 myArray 对象中的有效索引编号,返回true  
  5. trace(3 in myArray); // 3 不是 myArray 对象中的有效索引编号,返回false  

(5) instanceof运算符

用法expression instanceof function计算表达式的原型链是否包括function的原型对象。如果expression 的原型链包括function的原型对象,则返回true,否则返回false。

例如:

  1. var mySprite:Sprite = new Sprite();  
  2. // 创建名为mySprite的Sprite类的一个实例  
  3. trace(mySprite instanceof Sprite);   
  4. // 因为Sprite和DisplayObject的原型对象位于mySprite的原型链上,所以返回true  
  5. trace(mySprite instanceof DisplayObject);   
  6. // 返回true     

ActionScript 3.0包括instanceof运算符,是为了与ECMAScript 3.0版保持向后兼容,它对于选择用带构造函数的基于原型的继承来代替类继承的高级程序员可能非常有用。ActionScript中的is 运算符与Java中的 instanceof运算符等效。

使用is运算符检查对象是否为特定数据类型的成员。当与类一起使用时,instanceof运算符类似于is运算符,因为类的原型链包括其所有超类。

但是,原型链上不包括接口,因此当与接口一起使用时,instanceof运算符的结果始终为false,而is运算符的结果为true(如果对象属于实现指定接口的类)。

例如:

  1. var mySprite:Sprite = new Sprite();  
  2. trace(mySprite instanceof IBitmapDrawable);   
  3. // 由于instanceof运算符不能与IBitmapDrawable接
    口一起使用,因此返回false  
  4. trace(mySprite is IBitmapDrawable);   
  5. // 由于DisplayObject是实现IBitmapDrawable接
    口的Sprite类的超类,因此返回true