ActionScript 3.0 编程 |
|
|
|
| ActionScript 语言及其语法 > 运算符 | |||
运算符是一种特殊的函数,它们具有一个或多个操作数并返回相应的值。"操作数"是被运算符用作输入的值,通常是字面值、变量或表达式。例如,在下面的代码中,将加法运算符 (+) 和乘法运算符 (*) 与三个字面值操作数(2、3 和 4)结合使用来返回一个值。赋值运算符 (=) 随后使用该值将所返回的值 14 赋给变量 sumNumber。
var sumNumber:uint = 2 + 3 * 4; // uint = 14
运算符可以是一元、二元或三元的。"一元"运算符有 1 个操作数。例如,递增运算符 (++) 就是一元运算符,因为它只有一个操作数。"二元"运算符有 2 个操作数。例如,除法运算符 (/) 有 2 个操作数。"三元"运算符有 3 个操作数。例如,条件运算符 (?:) 具有 3 个操作数。
有些运算符是"重载的",这意味着它们的行为因传递给它们的操作数的类型或数量而异。例如,加法运算符 (+) 就是一个重载运算符,其行为因操作数的数据类型而异。如果两个操作数都是数字,则加法运算符会返回这些值的和。如果两个操作数都是字符串,则加法运算符会返回这两个操作数连接后的结果。下面的示例代码说明运算符的行为如何因操作数而异:
trace(5 + 5); // 10
trace("5" + "5"); // 55
运算符的行为还可能因所提供的操作数的数量而异。减法运算符 (-) 既是一元运算符又是二元运算符。对于减法运算符,如果只提供一个操作数,则该运算符会对操作数求反并返回结果;如果提供两个操作数,则减法运算符返回这两个操作数的差。下面的示例说明首先将减法运算符用作一元运算符,然后再将其用作二元运算符。
trace(-3); // -3 trace(7-2); // 5
运算符的优先级和结合律决定了运算符的处理顺序。虽然对于熟悉算术的人来说,编译器先处理乘法运算符 (*) 然后再处理加法运算符 (+) 似乎是自然而然的事情,但实际上编译器要求显式指定先处理哪些运算符。此类指令统称为"运算符优先级"。ActionScript 定义了一个默认的运算符优先级,您可以使用小括号运算符 (()) 来改变它。例如,下面的代码改变上一个示例中的默认优先级,以强制编译器先处理加法运算符,然后再处理乘法运算符:
var sumNumber:uint = (2 + 3) * 4; // uint == 20
您可能会遇到这样的情况:同一个表达式中出现两个或更多个具有相同的优先级的运算符。在这些情况下,编译器使用"结合律"的规则来确定先处理哪个运算符。除了赋值运算符之外,所有二进制运算符都是"左结合"的,也就是说,先处理左边的运算符,然后再处理右边的运算符。赋值运算符和条件运算符 (?:) 都是"右结合"的,也就是说,先处理右边的运算符,然后再处理左边的运算符。
例如,考虑小于运算符 (<) 和大于运算符 (>),它们具有相同的优先级。如果将这两个运算符用于同一个表达式中,那么,由于这两个运算符都是左结合的,因此先处理左边的运算符。也就是说,以下两个语句将生成相同的输出结果:
trace(3 > 2 < 1); // false trace((3 > 2) < 1); // false
将首先处理大于运算符,这会生成值 true,因为操作数 3 大于操作数 2。随后,将值 true 与操作数 1 一起传递给小于运算符。下面的代码表示此中间状态:
trace((true) < 1);
小于运算符将值 true 转换为数值 1,然后将该数值与第二个操作数 1 进行比较,这将返回值 false(因为值 1 不小于 1)。
trace(1 < 1); // false
您可以用括号运算符来改变默认的左结合律。您可以通过用小括号括起小于运算符及其操作数来命令编译器先处理小于运算符。下面的示例使用与上一个示例相同的数,但是因为使用了小括号运算符,所以生成不同的输出结果:
trace(3 > (2 < 1)); // true
将首先处理小于运算符,这会生成值 false,因为操作数 2 不小于操作数 1。值 false 随后将与操作数 3 一起传递给大于运算符。下面的代码表示此中间状态:
trace(3 > (false));
大于运算符将值 false 转换为数值 0,然后将该数值与另一个操作数 3 进行比较,这将返回 true(因为 3 大于 0)。
trace(3 > 0); // true
下表按优先级递减的顺序列出了 ActionScript 3.0 中的运算符。该表内同一行中的运算符具有相同的优先级。在该表中,每行运算符都比位于其下方的运算符的优先级高。
|
组 |
运算符 |
|---|---|
|
主要 |
[] {x:y} () f(x) new x.y x[y] <></> @ :: ..
|
|
后缀 |
x++ x--
|
|
一元 |
++x --x + - ~ ! delete typeof void
|
|
乘法 |
* / %
|
|
加法 |
+ -
|
|
按位移位 |
<< >> >>>
|
|
关系 |
< > <= >= as in instanceof is
|
|
等于 |
== != === !==
|
|
按位"与" |
&
|
|
按位"异或" |
^
|
|
按位"或" |
|
|
|
逻辑"与" |
&&
|
|
逻辑"或" |
||
|
|
条件 |
?:
|
|
赋值 |
= *= /= %= += -= <<= >>= >>>= &= ^= |=
|
|
逗号 |
,
|
主要运算符包括那些用来创建 Array 和 Object 字面值、对表达式进行分组、调用函数、实例化类实例以及访问属性的运算符。
下表列出了所有主要运算符,它们具有相同的优先级。属于 E4X 规范的运算符用 (E4X) 来表示。
|
运算符 |
执行的运算 |
|---|---|
[]
|
初始化数组 |
{x:y}
|
初始化对象 |
()
|
对表达式进行分组 |
f(x)
|
调用函数 |
new
|
调用构造函数 |
x.y x[y]
|
访问属性 |
<></>
|
初始化 XMLList 对象 (E4X) |
@
|
访问属性 (E4X) |
::
|
限定名称 (E4X) |
..
|
访问子级 XML 元素 (E4X) |
后缀运算符只有一个操作数,它递增或递减该操作数的值。虽然这些运算符是一元运算符,但是它们有别于其它一元运算符,被单独划归到了一个类别,因为它们具有更高的优先级和特殊的行为。在将后缀运算符用作较长表达式的一部分时,会在处理后缀运算符之前返回表达式的值。例如,下面的代码说明如何在递增值之前返回表达式 xNum++ 的值:
var xNum:Number = 0; trace(xNum++); // 0 trace(xNum); // 1
下表列出了所有的后缀运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
++
|
递增(后缀) |
--
|
递减(后缀) |
一元运算符只有一个操作数。这一组中的递增运算符 (++) 和递减运算符 (--) 是"前缀运算符",这意味着它们在表达式中出现在操作数的前面。前缀运算符与它们对应的后缀运算符不同,因为递增或递减操作是在返回整个表达式的值之前完成的。例如,下面的代码说明如何在递增值之后返回表达式 ++xNum 的值:
var xNum:Number = 0; trace(++xNum); // 1 trace(xNum); // 1
下表列出了所有的一元运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
++
|
递增(前缀) |
--
|
递减(前缀) |
+
|
一元 + |
-
|
一元 -(非) |
!
|
逻辑"非" |
~
|
按位"非" |
delete
|
删除属性 |
typeof
|
返回类型信息 |
void
|
返回 undefined 值 |
乘法运算符具有两个操作数,它执行乘、除或求模计算。
下表列出了所有的乘法运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
*
|
乘法 |
/
|
除法 |
%
|
求模 |
加法运算符有两个操作数,它执行加法或减法计算。下表列出了所有加法运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
+
|
加法 |
-
|
减法 |
按位移位运算符有两个操作数,它将第一个操作数的各位按第二个操作数指定的长度移位。下表列出了所有按位移位运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
<<
|
按位向左移位 |
>>
|
按位向右移位 |
>>>
|
按位无符号向右移位 |
关系运算符有两个操作数,它比较两个操作数的值,然后返回一个布尔值。下表列出了所有关系运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
<
|
小于 |
>
|
大于 |
<=
|
小于或等于 |
>=
|
大于或等于 |
as
|
检查数据类型 |
in
|
检查对象属性 |
instanceof
|
检查原型链 |
is
|
检查数据类型 |
等于运算符有两个操作数,它比较两个操作数的值,然后返回一个布尔值。下表列出了所有等于运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
==
|
等于 |
!=
|
不等于 |
===
|
严格等于 |
!==
|
严格不等于 |
按位逻辑运算符有两个操作数,它执行位级别的逻辑运算。按位逻辑运算符具有不同的优先级;下表按优先级递减的顺序列出了按位逻辑运算符:
|
运算符 |
执行的运算 |
|---|---|
&
|
按位"与" |
^
|
按位"异或" |
|
|
按位"或" |
逻辑运算符有两个操作数,它返回布尔结果。逻辑运算符具有不同的优先级;下表按优先级递减的顺序列出了逻辑运算符:
|
运算符 |
执行的运算 |
|---|---|
&&
|
逻辑"与" |
||
|
逻辑"或" |
条件运算符是一个三元运算符,也就是说它有三个操作数。条件运算符是应用 if..else 条件语句的一种简便方法。
|
运算符 |
执行的运算 |
|---|---|
?:
|
条件 |
赋值运算符有两个操作数,它根据一个操作数的值对另一个操作数进行赋值。下表列出了所有赋值运算符,它们具有相同的优先级:
|
运算符 |
执行的运算 |
|---|---|
=
|
赋值 |
*=
|
乘法赋值 |
/=
|
除法赋值 |
%=
|
求模赋值 |
+=
|
加法赋值 |
-=
|
减法赋值 |
<<=
|
按位向左移位赋值 |
>>=
|
按位向右移位赋值 |
>>>=
|
按位无符号向右移位赋值 |
&=
|
按位"与"赋值 |
^=
|
按位"异或"赋值 |
|=
|
按位"或"赋值 |
|
|
|
|