您的位置:首页 > 其它

flash as3.0笔记2

2020-01-15 09:20 736 查看
flash as3.0笔记2
2011年05月11日
  例如,如果您 已经定义了 example1 命名空间,则可以通过使用 use namespace example1 来访问该命名空间中的名称: use namespace example1; myFunction(); 一次可以打开多个命名空间。在使用 use namespace 打开了某个命名空间之后,它会在打开它的整个代码 块中保持打开状态。不能显式关闭命名空间。 但是,如果同时打开多个命名空间则会增加发生名称冲突的可能性。如果您不愿意打开命名空间,则可以用 命名空间和名称限定符来限定方法或属性名,从而避免使用 use namespace 指令。例如,下面的代码说明如何 用 example1 命名空间来限定 myFunction() 名称: example1::myFunction(); 使用命名空间 在 Flash Player API 中的 flash.utils.Proxy 类中,可以找到用来防止名称冲突的命名空间的实例。Proxy 类 取代了 ActionScript 2.0 中的 Object.__resolve 属性,可用来截获对未定义的属性或方法的引用,以免发生错误。 为了避免名称冲突,将 Proxy 类的所有方法都放在 flash_proxy 命名空间中。 为了更好地了解 flash_proxy 命名空间的使用方法, 您需要了解如何使用 Proxy 类。 Proxy 类的功能仅对于 继承它的类可用。换言之,如果您要对某个对象使用 Proxy 类的方法,则该对象的类定义必须是对 Proxy 类的 扩展。例如,如果您希望截获对未定义的方法的调用,则应扩展 Proxy 类,然后覆盖 Proxy 类的 callProperty() 方法。 前面已讲到,实现命名空间的过程通常分为三步,即定义、应用然后引用命名空间。但是,由于您从不显式 调用 Proxy 类的任何方法,因此只是定义和应用 flash_proxy 命名空间,而从不引用它。Flash Player API 定义 flash_proxy 命名空间并在 Proxy 类中应用它。 在您的代码中, 只需要将 flash_proxy 命名空间应用于扩展 Proxy 类的类。 flash_proxy 命名空间按照与下面类似的方法在 flash.utils 包中定义: package flash.utils { public namespace flash_proxy; } - 12 - 该命名空间将应用于 Proxy 类的方法,如下面摘自 Proxy 类的代码所示: public class Proxy { flash_proxy function callProperty(name:*, ... rest):* flash_proxy function deleteProperty(name:*):Boolean ... } 如下面的代码所示,您必须先导入 Proxy 类和 flash_proxy 命名空间。随后必须声明自己的类,以便它对 Proxy 类进行扩展(如果是在严格模式下进行编译,则还必须添加 dynamic 属性)。在覆盖 callProperty() 方法 时,必须使用 flash_proxy 命名空间。 package { import flash.utils.Proxy; import flash.utils.flash_proxy; dynamic class MyProxy extends Proxy { flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } } } 如果您创建 MyProxy 类的一个实例, 并调用一个未定义的方法 (如在下面的示例中调用的 testing() 方法) , Proxy 对象将截获对该方法的调用,并执行覆盖后的 callProperty() 方法内部的语句(在本例中为一个简单的 trace() 语句)。 var mySample:MyProxy = new MyProxy(); mySample.testing(); // 已截获方法调用:测试 将 Proxy 类的方法放在 flash_proxy 命名空间内部有两个好处。第一个好处是,在扩展 Proxy 类的任何类 的公共接口中,拥有单独的命名空间可提高代码的可读性。(在 Proxy 类中大约有 12 个可以覆盖的方法,所 有这些方法都不能直接调用。 将所有这些方法都放在公共命名空间中可能会引起混淆。 第二个好处是, Proxy ) 当 子类中包含名称与 Proxy 类方法的名称匹配的实例方法时,使用 flash_proxy 命名空间可避免名称冲突。例如, 您可能希望将自己的某个方法命名为 callProperty()。下面的代码是可接受的,因为您所用的 callProperty() 方法 位于另一个命名空间中: dynamic class MyProxy extends Proxy { public function callProperty() {} flash_proxy override function callProperty(name:*, ...rest):* { trace("method call intercepted: " + name); } } 当您希望以一种无法由四个访问控制说明符(public、private、internal 和 protected)实现的方式提供对方法 或属性的访问时,命名空间也可能会非常有用。例如,您可能有几个分散在多个包中的实用程序方法。您希望这 些方法对于您的所有包均可用,但是您不希望这些方法成为公共方法。为此,您可以创建一个新的命名空间,并 将它用作您自己的特殊访问控制说明符。 下面的示例使用用户定义的命名空间将两个位于不同包中的函数组合在一起。 通过将它们组合到同一个命名 空间中,可以通过一条 use namespace 语句使这两个函数对于某个类或某个包均可见。 - 13 - 本示例使用四个文件来说明此方法。所有的文件都必须位于您的类路径中。第一个文件 (myInternal.as) 用 来定义 myInternal 命名空间。 由于该文件位于名为 example 的包中, 因此您必须将该文件放在名为 example 的 文件夹中。该命名空间标记为 public,因此可以导入到其它包中。 // example 文件夹中的 myInternal.as package example { public namespace myInternal = "http://www.adobe.com/2006/actionscript/examples"; } 第二个文件 (Utility.as) 和第三个文件 (Helper.as) 定义的类中包含应可供其它包使用的方法。 Utility 类位于 example.alpha 包中,这意味着该文件应放在 example 文件夹下的 alpha 子文件夹中。Helper 类位于 example.beta 包中,这意味着该文件应放在 example 文件夹下的 beta 子文件夹中。这两个包(example.alpha 和 example.beta)在使用命名空间之前必须先导入它。 // example/alpha 文件夹中的 Utility.as package example.alpha { import example.myInternal; public class Utility { private static var _taskCounter:int = 0; public static function someTask() { _taskCounter++; } myInternal static function get taskCounter():int { return _taskCounter; } } } // example/beta 文件夹中的 Helper.as package example.beta { import example.myInternal; public class Helper { private static var _timeStamp:Date; public static function someTask() { _timeStamp = new Date(); } myInternal static function get lastCalled():Date - 14 - { return _timeStamp; } } } 第四个文件 (NamespaceUseCase.as) 是主应用程序类,应是 example 文件夹的同级。在 Adobe Flash CS3 Professional 中,将此类用作 FLA 的文档类。NamespaceUseCase 类还导入 myInternal 命名空间,并使用它来 调用位于其它包中的两个静态方法。在本示例中,使用静态方法的目的仅在于简化代码。在 myInternal 命名空 间中既可以放置静态方法也可以放置实例方法。 // NamespaceUseCase.as package { import flash.display.MovieClip; import example.myInternal; // 导入命名空间 import example.alpha.Utility; // 导入 Utility 类 import example.beta.Helper; // 导入 Helper 类 public class NamespaceUseCase extends MovieClip { public function NamespaceUseCase() { use namespace myInternal; Utility.someTask(); Utility.someTask(); trace(Utility.taskCounter); // 2 Helper.someTask(); trace(Helper.lastCalled); } } } // [上次调用 someTask() 的时间] 变量变量可用来存储程序中使用的值。要声明变量,必须将 var 语句和变量名结合使用。在 ActionScript 3.0 中,总是需要使用 var 语句。 如果在声明变量时省略了 var 语句,在严格模式下将出现编译器错误,在标准模式下将出现运行时错误。 要将变量与一个数据类型相关联, 则必须在声明变量时进行此操作。 在声明变量时不指定变量的类型是合法 的,但这在严格模式下将产生编译器警告。可通过在变量名后面追加一个后跟变量类型的冒号 (:) 来指定变量 类型。 可以使用赋值运算符 (=) 为变量赋值。您可能会发现在声明变量的同时为变量赋值可能更加方便。通常, 在声明变量的同时为变量赋值的方法不仅在赋予基元值(如整数和字符串)时很常用,而且在创建数组或实例化 类的实例时也很常用。 如果要声明多个变量,则可以使用逗号运算符 (,) 来分隔变量,从而在一行代码中声明所有这些变量。也 可以在同一行代码中为其中的每个变量赋值。 了解变量的作用域 变量的"作用域"是指可在其中通过引用词汇来访问变量的代码区域。 "全局"变量是指在代码的所有区域中定 义的变量,而"局部"变量是指仅在代码的某个部分定义的变量。在 ActionScript 3.0 中,始终为变量分配声明 它们的函数或类的作用域。全局变量是在任何函数或类定义的外部定义的变量。 - 15 - 变量的"作用域 作用域"是指可在其中通过引用词汇来访问变量的代码区域。 全局"变量是指在代码的所有区域中定 "全局 作用域 全局 义的变量,而"局部 局部"变量是指仅在代码的某个部分定义的变量。在 ActionScript 3.0 中,始终为变量分配声明 局部 它们的函数或类的作用域。全局变量 全局变量是在任何函数或类定义的外部定义的变量。 全局变量在函数定义的内部和外 全局变量 部均可用。 可以通过在函数定义内部声明变量来将它声明为局部变量 局部变量。可定义局部变量的最小代码区域就是函数定义。 局部变量 在函数内部声明的局部变量仅存在于该函数中。该变量在该函数外部将不可用。 如果用于局部变量的变量名已经被声明为全局变量,那么,当局部变量在作用域内时,局部定义会隐藏(或 遮蔽)全局定义。全局变量在该函数外部仍然存在。 代码块是指左大括号 ({) 与右大括号 (}) 之间的任意一组语句。在在 ActionScript 中,如果您在某个代 码块中声明一个变量, 那么, 该变量不仅在该代码块中可用, 而且还在该代码块所属函数的其它任何部分都可用。 有趣的是,如果缺乏块级作用域,那么,只要在函数结束之前对变量进行声明,就可以在声明变量之前读写 它。这是由于存在一种名为"提升 提升"的方法,该方法表示编译器会将所有的变量声明移到函数的顶部。 提升 但是,编译器将不会提升任何赋值语句。 这意味着您甚至可以在声明变量之前为变量赋值。 默认值 "默认值 默认值"是在设置变量值之前变量中包含的值。 首次设置变量的值实际上就是"初始化 初始化"变量。 如果您声明了 默认值 初始化 一个变量,但是没有设置它的值,则该变量便处于"未初始化"状态。未初始化的变量的值取决于它的数据类型。 下表说明了变量的默认值,并按数据类型对这些值进行组织: 数据类型 Boolean int Number Object String uint 未声明(与类型注释 * 等效) 其它所有类(包括用户定义的 类)。 默 认 值 false 0 NaN null null 0 undef ined null 对于 Number 类型的变量,默认值是 NaN(而非某个数字),NaN 是一个由 IEEE-754 标准定义的特殊值, 它表示非数字的某个值。 如果您声明某个变量,但是未声明它的数据类型,则将应用默认数据类型 *,这实际上表示该变量是无类型 变量。如果您没有用值初始化无类型变量,则该变量的默认值是 undefined。 对于 Boolean、Number、int 和 uint 以外的数据类型,所有未初始化变量的默认值都是 null。这适用于 由 Flash Player API 定义的所有类以及您创建的所有自定义类。 对于 Boolean、Number、int 或 uint 类型的变量,null 不是有效值。如果您尝试将值 null 赋予这样的 变量,则该值会转换为该数据类型的默认值。对于 Object 类型的变量,可以赋予 null 值。如果您尝试将值 undefined 赋予 Object 类型的变量,则该值会转换为 null。 对于 Number 类型的变量,有一个名为 isNaN() 的特殊的顶级函数。如果变量不是数字,该函数将返回布 尔值 true,否则将返回 false。 数据类型 "数据类型 数据类型"用来定义一组值。ActionScript 3.0 中的所有值均是对象,而与它们是基元值还是复杂值无关。 数据类型 "基元值 基元值"是一个属于下列数据类型之一的值:Boolean、int、Number、String 和 uint。基元值的处理速度 基元值 通常比复杂值的处理速度快,因为 ActionScript 按照一种尽可能优化内存和提高速度的特殊方式来存储基元 值。 - 16 - ActionScript 在内部将基元值作为不可改变的对象进行存储。这意味着按引用传递与按值传递同样有效。 这可以减少内存的使用量并提高执行速度,因为引用通常比值本身小得多。 "复杂值 复杂值"是指基元值以外的值。 定义复杂值的集合的数据类型包括: Array、 Date、 Error、 Function、 RegExp、 复杂值 XML 和 XMLList。 在 ActionScript 3.0 中,出于实用的目的,不对基元值及其包装对象加以区分。所有的值(甚至基元值) 都是对象。Flash Player 将这些基元类型视为特例 ― 它们的行为与对象相似,但是不需要创建对象所涉及的 正常开销。 上面列出的所有基元数据类型和复杂数据类型都是由 ActionScript 3.0 核心类定义的。通过 ActionScript 3.0 核心类,可以使用字面值 字面值(而非 new 运算符)创建对象。 字面值 类型检查 ActionScript 3.0 是动态类型的语言,它在运行时执行类型检查,同时也支持在名为"严格模式"的特殊编 译器模式下在编译时执行类型检查。在严格模式下,类型检查既发生在编译时也发生在运行时,但是在标准模式 下,类型检查仅发生在运行时。 在构造代码时,动态类型的语言带来了极大的灵活性,但代价是在运行时可能出现类型错误。静态类型的语 言在编译时报告类型错误,但代价是要求类型信息在编译时是已知的。 编译时类型检查 在较大的项目中通常建议使用编译时类型检查,因为随着项目变大,相对于尽早捕获类型错误,数据类型的 灵活性通常会变得不那么重要。这就是为什么将 Adobe Flash CS3 Professional 和 Adobe Flex Builder 2 中 的 ActionScript 编译器默认设置为在严格模式下运行的原因。 为了提供编译时类型检查, 编译器需要知道代码中的变量或表达式的数据类型信息。 为了显式声明变量的数 据类型,请在变量名后面添加后跟数据类型的冒号运算符 (:) 作为其后缀。要将数据类型与参数相关联,应使 用后跟数据类型的冒号运算符。 在严格模式下,ActionScript 编译器将类型不匹配报告为编译器错误。 但是,即使在严格模式下,也可以选择不在赋值语句右侧指定类型,从而退出编译时类型检查。可以通过省 略类型注释或使用特殊的星号 (*) 类型注释,来将变量或表达式标记为无类型。 运行时类型检查 在 ActionScript 3.0 中,无论是在严格模式下还是在标准模式下编译,在运行时都将进行类型检查。 还可能会出现如下情形:即使在严格模式下运行,也可能会获得运行时类型错误。如果您使用严格模式,但 是通过使用无类型变量而退出了编译时类型检查,就可能会出现上述情形。当您使用无类型变量时,并不会消除 类型检查,而只是将其延迟到运行时执行。 与编译时类型检查相比, 运行时类型检查还允许更灵活地使用继承。 标准模式会将类型检查延迟到运行时执 行,从而允许您引用子类的属性,即使您"上传 上传"也是如此。当您使用基类来声明类实例的类型,但是使用子类构 上传 造函数来实例化类实例时,就会发生上传。上传被视为安全操作,这是因为基类不包含子类中没有的任何属性或 方法。但是,子类中则包含其基类中没有的属性或方法。 is 运算符 is 运算符是 ActionScript 3.0 中的新增运算符,它可用来测试变量或表达式是否为给定数据类型的成员。 is 运算符检查正确的继承层次结构,不但可以用来检查对象是否为特定类的实例,而且还可以检查对象是否是用来实现特定接口的类的实例。 as 运算符 as 运算符是 ActionScript 3.0 中的新增运算符,也可用来检查表达式是否为给定数据类型的成员。但是, 与 is 运算符不同的是,as 运算符不返回布尔值,而是返回表达式的值(代替 true)或 null(代替 false)。 在使用 as 运算符时,右侧的操作数必须是数据类型。如果尝试使用表达式(而非数据类型)作为右侧的操 作数,将会产生错误。 动态类 "动态 动态"类定义在运行时可通过添加/更改属性和方法来改变的对象。 非动态类 (如 String 类) 动态 是"密封"类。您不能在运行时向密封类中添加属性或方法。 在声明类时,可以通过使用 dynamic 属性来创建动态类。 - 17 - 如果要在以后实例化动态类的实例, 则可以在类定义的外部向该类中添加属性或方法。 添加到 动态类实例中的属性是运行时实体, 因此会在运行时完成所有类型检查。 不能向以这种方式添加的 属性中添加类型注释。 您还可以定义一个函数并将该函数附加到动态类实例的某个属性, 从而向动 态类实例中添加方法。 但是, 以这种方式创建的方法对于动态类的任何私有属性或方法都不具有访 问权限。而且,即使对动态类的公共属性或方法的引用也必须用 this 关键字或类名进行限定。 数据类型说明基元数据类型包括 Boolean、int、Null、Number、String、uint 和 void。ActionScript 核心类还定义下列复 基元数据类型 复 杂数据类型:Object、Array、Date、Error、Function、RegExp、XML 和 XMLList。 杂数据类型 Boolean 数据类型 Boolean 数据类型包含两个值:true 和 false。对于 Boolean 类型的变量,其它任何值都是无效的。已经声 明但尚未初始化的布尔变量的默认值是 false。 int 数据类型 int 数据类型在内部存储为 32 位整数,它包含一组介于 -2,147,483,648 (-231) 和 2,147,483,647 (231 - 1) 之 间的整数(包括 -2,147,483,648 和 2,147,483,647)。早期的 ActionScript 版本仅提供 Number 数据类型,该数 据类型既可用于整数又可用于浮点数。在 ActionScript 3.0 中,现在可以访问 32 位带符号整数和无符号整数的 低位机器类型。如果您的变量将不会使用浮点数,那么,使用 int 数据类型来代替 Number 数据类型应会更快 更高效。 对于小于 int 的最小值或大于 int 的最大值的整数值,应使用 Number 数据类型。Number 数据类型可以 处理 -9,007,199,254,740,992 和 9,007,199,254,740,992(53 位整数值)之间的值。int 数据类型的变量的默认值 是 0。 Null 数据类型 Null 数据类型仅包含一个值:null。这是 String 数据类型和用来定义复杂数据类型的所有类(包括 Object 类) 的默认值。 其它基元数据类型 (如 Boolean、 Number、 和 uint) int 均不包含 null 值。 如果您尝试向 Boolean、 Number、int 或 uint 类型的变量赋予 null,则 Flash Player 会将 null 值转换为相应的默认值。不能将 Null 数 据类型用作类型注释。 Number 数据类型 在 ActionScript 3.0 中,Number 数据类型可以表示整数、无符号整数和浮点数。但是,为了尽可能提高性 能,应将 Number 数据类型仅用于浮点数,或者用于 int 和 uint 类型可以存储的、大于 32 位的整数值。要存 储浮点数,数字中应包括一个小数点。如果您省略了小数点,数字将存储为整数。 Number 数据类型使用由 IEEE 二进制浮点算术标准 (IEEE-754) 指定的 64 位双精度格式。此标准规定如 何使用 64 个可用位来存储浮点数。其中的 1 位用来指定数字是正数还是负数。11 位用于指数,它以二进制的 形式存储。其余的 52 位用于存储"有效位数"(又称为"尾数"),有效位数是 2 的 N 次幂,N 即前面所提到的 指数。 可以将 Number 数据类型的所有位都用于有效位数,也可以将 Number 数据类型的某些位用于存储指数, 后者可存储的浮点数比前者大得多。 Number 类型可以表示的最小值和最大值存储在 Number 类的名为 Number.MAX_VALUE 和 Number.MIN_VALUE 的静态属性中。 Number.MAX_VALUE == 1.79769313486231e+308 Number.MIN_VALUE == 4.940656458412467e-324 尽管这个数字范围很大,但代价是此范围的精度有所降低。Number 数据类型使用 52 位来存储有效位数, 因此,那些要求用 52 位以上的位数才能精确表示的数字(如分数 1/3)将只是近似值。如果应用程序要求小数 达到绝对精度,则需要使用实现小数浮点算术(而非二进制浮点算术)的软件。 如果用 Number 数据类型来存储整数值, 则仅使用 52 位有效位数。 Number 数据类型使用 52 位和一个特 53 殊的隐藏位来表示介于 -9,007,199,254,740,992 (-2 ) 和 9,007,199,254,740,992 (253) 之间的整数。 Flash Player 不但将 NaN 值用作 Number 类型的变量的默认值,而且还将其用作应返回数字、却没有返回 数字的任何运算的结果。其它特殊的 Number 值包括"正无穷大"和"负无穷大"。 在被 0 除时,如果被除数也是 0,则结果只有一个,那就是 NaN。在被 0 除时,如果被除数是正数,则 结果为正无穷大;如果被除数是负数,则结果为负无穷大。 - 18 - String 数据类型 String 数据类型表示一个 16 位字符的序列。字符串在内部存储为 Unicode 字符,并使用 UTF-16 格式。 字符串是不可改变的值,就像在 Java 编程语言中一样。对字符串值执行运算会返回字符串的一个新实例。用 String 数据类型声明的变量的默认值是 null。 虽然 null 值与空字符串 ("") 均表示没有任何字符, 但二者并不相 同。 uint 数据类型 uint 数据类型在内部存储为 32 位无符号整数, 它包含一组介于 0 和 4,294,967,295 (232- 1) 之间的整数 (包 括 0 和 4,294,967,295)。uint 数据类型可用于要求非负整数的特殊情形。例如,必须使用 uint 数据类型来表 示像素颜色值,因为 int 数据类型有一个内部符号位,该符号位并不适合处理颜色值。对于大于 uint 的最大值 的整数值,应使用 Number 数据类型,该数据类型可以处理 53 位整数值。uint 数据类型的变量的默认值是 0。 void 数据类型 void 数据类型仅包含一个值:undefined。在 ActionScript 3.0 中,Object 实例的默认值是 null。如果您尝 试将值 undefined 赋予 Object 类的实例,Flash Player 会将该值转换为 null。您只能为无类型变量赋予 undefined 这一值。无类型变量是指缺乏类型注释或者使用星号 (*) 作为类型注释的变量。只能将 void 用作返 回类型注释。 Object 数据类型 Object 数据类型是由 Object 类定义的。Object 类用作 ActionScript 中的所有类定义的基类。ActionScript 3.0 中的 Object 数据类型与早期版本中的 Object 数据类型存在以下三方面的区别:第一,Object 数据类型不 再是指定给没有类型注释的变量的默认数据类型。第二,Object 数据类型不再包括 undefined 这一值,该值以 前是 Object 实例的默认值。第三,在 ActionScript 3.0 中,Object 类实例的默认值是 null。 在早期的 ActionScript 版本中,会自动为没有类型注释的变量赋予 Object 数据类型。ActionScript 3.0 现在 包括真正无类型变量这一概念,因此不再为没有类型注释的变量赋予 Object 数据类型。没有类型注释的变量现 在被视为无类型变量。 如果您希望向代码的读者清楚地表明您是故意将变量保留为无类型, 可以使用新的星号 (*) 表示类型注释,这与省略类型注释等效。 只有无类型变量才能保存值 undefined。如果您尝试将值 undefined 赋给具有数据类型的变量,Flash Player 会将该值 undefined 转换为该数据类型的默认值。对于 Object 数据类型的实例,默认值是 null,这意味着,如 果尝试将 undefined 赋给 Object 实例,Flash Player 会将值 undefined 转换为 null。 类型转换在将某个值转换为其它数据类型的值时,就说发生了类型转换 类型转换。类型转换可以是"隐式的",也可以是"显式 类型转换 的"。隐式转换又称为"强制",有时由 Flash Player 在运行时执行。显式转换又称为"转换",在代码指示编译 器将一个数据类型的变量视为属于另一个数据类型时发生。 在涉及基元值时, 转换功能将一个数据类型的值实际 转换为另一个数据类型的值。 要将对象转换为另一类型,请用小括号括起对象名并在它前面加上新类型的名称。 隐式转换 对于用户定义的类型,当要转换的值是目标类(或者派生自目标类的类)的实例时,隐式转换会成功。如果 隐式转换不成功,就会出现错误。 对于基元类型而言, 隐式转换是通过调用内部转换算法来处理的, 该算法与显式转换函数所调用的算法相同。 显式转换 在严格模式下进行编译时, 使用显式转换会非常有用, 因为您有时可能会不希望因类型不匹配而生成编译时 错误。当您知道强制功能会在运行时正确转换您的值时,可能就属于这种情况。 转换为 int、uint 和 Number int、 您可以将任何数据类型转换为以下三种数字类型之一:int、uint 和 Number。如果 Flash Player 由于某 种原因而无法转换数字,则会为 int 和 uint 数据类型赋予默认值 0,为 Number 数据类型赋予默认值 NaN。 如果将布尔值转换为数字,则 true 变成值 1,false 变成值 0。 仅包含数字的字符串值可以成功地转换为数字类型之一。 看上去像负数的字符串或者表示十六进制值的字符 串(例如,0x1A)也可以转换为数字类型。转换过程中会忽略字符串值中的前导或尾随空白字符。还可以使用 Number() 来转换看上去像浮点数的字符串。如果包含小数点,则会导致 uint() 和 int() 返回一个整数,小数 点和它后面的字符被截断。 - 19 - 对于包含非数字字符的字符串值,在用 int() 或 uint() 转换时,将返回 0;在用 Number() 转换时,将 返回 NaN。 转换过程中会忽略前导和尾随空白, 但是, 如果字符串中包含将两个数字隔开的空白, 则将返回 0 或 NaN。 在 ActionScript 3.0 中,Number() 函数不再支持八进制数或基数为 8 的数。对于 ActionScript 3.0 中 的 Number() 函数, 会忽略前导 0。 将一种数值类型 数值类型的值赋给另一种数值类型的变量时,转换并不是必需的。即使在严格模式下,数值类型也会 数值类型 隐式转换为其它数值类型。这意味着,在某些情况下,在超出类型的范围时,可能会生成意外的值。 var myUInt:uint = -3; // 将 int/Number 值赋给 uint 变量 trace(myUInt); // 4294967293 var myNum:Number = sampleUINT; // 将 int/uint 值赋给 Number 变量 trace(myNum) // 4294967293 var myInt:int = uint.MAX_VALUE + 1; // 将 Number 值赋给 uint 变量 trace(myInt); // 0 myInt = int.MAX_VALUE + 1; // 将 uint/Number 值赋给 int 变量 trace(myInt); // -2147483648 下表概述了将其它数据类型转换为 Number、int 或 uint 数据类型的结果。 数据类型或值 Boolean Date null Object String undefined 转换为 Boolean Number、 转换为 Number、int 或 uint 时的结果 如果值为 true,则结果为 1;否则为 0。 Date 对象的内部表示形式,即从 1970 年 1 月 1 日午夜(通用时间)以来所经过的毫 秒数。 0 如果实例为 null 并转换为 Number,则结果为 NaN;否则为 0。 如果 Flash Player 可以将字符串转换为数字,则结果为数字;否则,如果转换为 Number,则结果为 NaN,如果转换为 int 或 uint,则结果为 0。 如果转换为 Number,则结果为 NaN;如果转换为 int 或 uint,则结果为 0。 在从任何数值数据类型(uint、int 和 Number)转换为 Boolean 时,如果数值为 0,则结果 为 false;否则为 true。对于 Number 数据类型,如果值为 NaN,则结果也为 false。 在将字符串值转换为 Boolean 数据类型时, 如果字符串为 null 或空字符串 (""), 则会返回 false。否则,将返回 true。 在将 Object 类的实例转换为 Boolean 数据类型时,如果该实例为 null,则将返回 false; 否则将返回 true。 在严格模式下, 系统会对布尔变量进行特殊处理, 因为您不必转换即可向布尔变量赋予任何数 据类型的值。即使在严格模式下,也可以将所有的数据类型隐式强制为 Boolean 数据类型。换言 之,与几乎其它所有数据类型不同,转换为 Boolean 数据类型不是避免在严格模式下出错所必需 的。 下表概述了在从其它数据类型转换为 Boolean 数据类型时的结果: 数据类型或值 转换为 Boolean 数据类型时的结果 String 如果值为 null 或空字符串 (""),则结果为 false;否则为 true。 null false Number、int 或 uint如果值为 NaN 或 0,则结果为 false;否则为 true。 Object 如果实例为 null,则结果为 false;否则为 true。转换为 String 从任何数值数据类型转换为 String 数据类型时,都会返回数字的字符串表示形式。在将布尔值转换为 String 数据类型时,如果值为 true,则返回字符串 "true";如果值为 false,则返回字符串 "false"。 在从 Object 类的实例转换为 String 数据类型时,如果该实例为 null,则返回字符串 "null"。否则,将 返回字符串 "[object Object]"。 - 20 - 在从 Array 类的实例转换为 String 时,会返回一个字符串,其中包含所有数组元素的逗号分隔列表。 在从 Date 类的实例转换为 String 时,会返回该实例所包含日期的字符串表示形式。 (输出结果显示的是 太平洋夏令时) 下表概述了在将其它数据类型转换为 String 数据类型时的结果: 数据类型或值 Array Boolean Date null Object 转换为 String 数据类型时的结果 一个包含所有数组元素的字符串。 "true" 或 "false"。 Date 对象的字符串表示形式。 "null" 如果实例为 null,则结果为 "null";否则为 "[object Object]"。 Number、int 或 uint数字的字符串表示形式。 语法语言的语法定义了一组在编写可执行代码时必须遵循的规则。 区分大小写 ActionScript 3.0 是一种区分大小写的语言。只是大小写不同的标识符会被视为不同。 点语法 可以通过点运算符 ( . ) 来访问对象的属性和方法。使用点语法,可以使用后跟点运算符和属性名或方法名 的实例名来引用类的属性或方法。 定义包时,可以使用点语法。可以使用点运算符来引用嵌套包。 字面值 "字面值"是直接出现在代码中的值。 字面值还可以组合起来构成复合字面值。数组文本括在中括号字符 ([ ]) 中,各数组元素之间用逗号隔开。 数组文本可用于初始化数组。您可以使用 new 语句将复合字面值作为参数传递给 Array 类构造函数,但是,您 还可以在实例化下面的 ActionScript 核心类的实例时直接赋予字面值: Object、 Array、 String、 Number、 int、 uint、 XML、XMLList 和 Boolean。 字面值还可用来初始化通用对象。通用对象是 Object 类的一个实例。对象字面值括在大括号 ({ }) 中,各 对象属性之间用逗号隔开。每个属性都用冒号字符 ( : ) 进行声明,冒号用于分隔属性名和属性值。 可以使用 new 语句创建一个通用对象并将该对象的字面值作为参数传递给 Object 类构造函数,也可以在 声明实例时直接将对象字面值赋给实例。 分号 可以使用分号字符 ( ; ) 来终止语句。如果您省略分号字符,则编译器将假设每一行代码代表一条语句。由 于很多程序员都习惯使用分号来表示语句结束,因此,如果您坚持使用分号来终止语句,则代码会更易于阅读。 使用分号终止语句可以在一行中放置多个语句,但是这样会使代码变得难以阅读。 小括号 在 ActionScript 3.0 中,可以通过三种方式来使用小括号 (())。 首先,可以使用小括号来更改表达式中的运算顺序。组合到小括号中的运算总是最先执行。 第二,可以结合使用小括号和逗号运算符 (,) 来计算一系列表达式并返回最后一个表达式的结果。 第三,可以使用小括号来向函数或方法传递一个或多个参数。 注释 ActionScript 3.0 代码支持两种类型的注释:单行注释 多行注释 单行注释和多行注释 单行注释 多行注释。这些注释机制与 C++ 和 Java 中的注释 机制类似。编译器将忽略标记为注释的文本。 单行注释以两个正斜杠字符 (//) 开头并持续到该行的末尾。 多行注释以一个正斜杠和一个星号 (/*) 开头,以一个星号和一个正斜杠 (*/) 结尾。 关键字和保留字 "保留字"是一些单词, 因为这些单词是保留给 ActionScript 使用的, 所以, 不能在代码中将它们用作标识符。 - 21 - 保留字包括"词汇关键字 词汇关键字",编译器将词汇关键字从程序的命名空间中删除。如果您将词汇关键字用作标识符,则 词汇关键字 编译器会报告一个错误。 下表列出了 ActionScript 3.0 词汇关键字: as class delet e false if break const do finally cas e ch cat con def ault tinue els e for ends fun ction in is pa ckage ret urn this try voi d ile thr ow typ eof wh ext imple im ments port interfa int ernal nul l pu blic switch true var insta nceof ce nativ e priva te supe r to use with ted new protec 有一小组名为"句法关键字 句法关键字"的关键字,这些关键字可用作标识符,但是在某些上下文中具有特殊的含义。下 句法关键字 表列出了 ActionScript 3.0 句法关键字: eac h inc lude get et name space nativ dy namic inal e stat ov erride ic 还有几个有时称为"供将来使用的保留字 供将来使用的保留字"的标识符。这些标识符不是为 ActionScript 3.0 保留的,但是其中 供将来使用的保留字 的一些可能会被采用 ActionScript 3.0 的软件视为关键字。您可以在自己的代码中使用其中的许多标识符,但是 Adobe 不建议您使用它们,因为它们可能会在以后的 ActionScript 版本中作为关键字出现。 ab bool stract ean e ch ar ex port byt cast enum intrinsic deb do ugger uble float got o - 22 - lo ng th rows vi rtual prot otype rt to vola tile sho synchro nized type tra nsient 常量 ActionScript 3.0 支持 const 语句,该语句可用来创建常量。常量 常量是指具有无法改变的固定值的属性。只能 常量 为常量赋值一次,而且必须在最接近常量声明的位置赋值。例如,如果将常量声明为类的成员,则只能在声明过 程中或者在类构造函数中为常量赋值。 如果您尝试以其它任何方法向常量赋予初始值,则会出现错误。 Flash Player API 定义了一组广泛的常量供您使用。按照惯例,ActionScript 中的常量全部使用大写字母,各 个单词之间用下划线字符 ( _) 分隔。 运算符 运算符是一种特殊的函数, 它们具有一个或多个操作数并返回相应的值。 "操作数"是被运算符用作输入的值, 通常是字面值、变量或表达式。 运算符可以是一元、二元或三元的。"一元"运算符有 1 个操作数。"二元"运算符有 2 个操作数。"三元"运 算符有 3 个操作数。 有些运算符是"重载的",这意味着它们的行为因传递给它们的操作数的类型或数量而异。例如,加法运算符 (+) 就是一个重载运算符,其行为因操作数的数据类型而异。如果两个操作数都是数字,则加法运算符会返回这 些值的和。如果两个操作数都是字符串,则加法运算符会返回这两个操作数连接后的结果。 运算符的行为还可能因所提供的操作数的数量而异。 减法运算符 (-) 既是一元运算符又是二元运算符。 对于 减法运算符,如果只提供一个操作数,则该运算符会对操作数求反并返回结果;如果提供两个操作数,则减法运 算符返回这两个操作数的差。 运算符的优先级和结合律 运算符的优先级和结合律决定了运算符的处理顺序。 虽然对于熟悉算术的人来说, 编译器先处理乘法运算符 (*) 然后再处理加法运算符 (+) 似乎是自然而然的事情,但实际上编译器要求显式指定先处理哪些运算符。此类 指令统称为"运算符优先级"。ActionScript 定义了一个默认的运算符优先级,您可以使用小括号运算符 (()) 来改 变它。 您可能会遇到这样的情况:同一个表达式中出现两个或更多个具有相同的优先级的运算符。在这些情况下, 编译器使用"结合律"的规则来确定先处理哪个运算符。 除了赋值运算符之外, 所有二进制运算符都是"左结合"的, 也就是说,先处理左边的运算符,然后再处理右边的运算符。赋值运算符和条件运算符 (?:) 都是"右结合"的, 也就是说,先处理右边的运算符,然后再处理左边的运算符。 如果将具有相同的优先级的两个运算符用于同一个表达式中,那么,由于这两个运算符都是左结合的,因此 先处理左边的运算符。 您可以用括号运算符来改变默认的左结合律。 您可以通过用小括号括起小于运算符及其操作数来命令编译器 先处理小于运算符。 下表按优先级递减的顺序列出了 ActionScript 3.0 中的运算符。该表内同一行中的运算符具有相同的优先 级。在该表中,每行运算符都比位于其下方的运算符的优先级高。 组 主要 后缀 一元 乘法 加法 运算符 [] {x:y} () f(x) new x.y x[y] @ :: .. x++ x-++x --x + - ~ ! delete typeof void */% +- 23 - 按 位 移位 关系 等于 按位" 与" 按位" 异或" 按位" 或" 逻辑" 与" 逻辑" 或" 条件 赋值 逗号 > >>> = as in instanceof is == != === !== & ^ | && || ?: = *= /= %= += -= >= >>>= &= ^= |= , 主要运算符 主要运算符包括那些用来创建 Array 和 Object 字面值、对表达式进行分组、调用函数、实例化类实例以及 访问属性的运算符。 下表列出了所有主要运算符,它们具有相同的优先级。属于 E4X 规范的运算符用 (E4X) 来表示。 运 算符 [] {x :y} () f(x ) ne w x. y x[y] @ :: .. 执行的运算 初始化数组 初始化对象 对表达式进行分组 调用函数 调用构造函数 访问属性 初 始 化 XMLList 对 象 (E4X) 访问属性 (E4X) 限定名称 (E4X) 访 问 子 级 XML 元 素 (E4X) 后缀运算符 后缀运算符只有一个操作数,它递增或递减该操作数的值。虽然这些运算符是一元运算符,但是它们有别于 其它一元运算符,被单独划归到了一个类别,因为它们具有更高的优先级和特殊的行为。在将后缀运算符用作较 长表达式的一部分时,会在处理后缀运算符之前返回表达式的值。 下表列出了所有的后缀运算符,它们具有相同的优先级: - 24 - 运 执行的运 算符 算 + + -递增(后 缀) 递减(后 缀) 一元运算符 一元运算符只有一个操作数。这一组中的递增运算符 (++) 和递减运算符 (--) 是"前缀运算符",这意味着它 们在表达式中出现在操作数的前面。 前缀运算符与它们对应的后缀运算符不同, 因为递增或递减操作是在返回整 个表达式的值之前完成的。 下表列出了所有的一元运算符,它们具有相同的优先级: 运 算符 + + -+ ! ~ de lete ty peof vo id 执行的运算 递增(前缀) 递减(前缀) 一元 + 一元 -(非) 逻辑"非" 按位"非" 删除属性 返回类型信息 返 undefined 值 回 乘法运算符 乘法运算符具有两个操作数,它执行乘、除或求模计算。
  • 点赞
  • 收藏
  • 分享
  • 文章举报
iteye_19802 发布了19 篇原创文章 · 获赞 0 · 访问量 491 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: