运算符的优先级和结合律决定了处理运算符的顺序。虽然对于熟悉算术的人来说,编译器先处理乘法运算符 (*) 后处理加法运算符 (+) 似乎是自然而然的事情,但实际上编译器要求显式指定先处理哪些运算符。此类指令统称为运算符优先级。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 + - ~ ! 删除 typeof 无效
|
乘性
|
* / %
|
加性
|
+ -
|
按位移位
|
<< >> >>>
|
关系
|
< > <= >= 如在 instanceof 中为
|
等于
|
== != === !==
|
按位 AND
|
&
|
按位 XOR
|
^
|
按位 OR
|
|
|
逻辑 AND
|
&&
|
逻辑 OR
|
||
|
条件
|
?:
|
赋值
|
= *= /= %= += -= <<= >>= >>>= &= ^= |=
|
逗号
|
,
|