运算符

运算符是一种特殊的函数,它们具有一个或多个操作数并返回相应的值。操作数是运算符用作输入的值(通常为字面值、变量或表达式)。例如,在下面的代码中,将加法运算符 (+) 和乘法运算符 (*) 与三个字面值操作数(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 + - ~ ! 删除 typeof 无效

乘性

* / %

加性

+ -

按位移位

<< >> >>>

关系

< > <= >= 如在 instanceof 中为

等于

== != === !==

按位 AND

&

按位 XOR

^

按位 OR

|

逻辑 AND

&&

逻辑 OR

||

条件

?:

赋值

= *= /= %= += -= <<= >>= >>>= &= ^= |=

逗号

,

主要运算符

主要运算符包括那些用来创建 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

下表列出了所有的一元运算符,它们具有相同的优先级:

运算符

执行的运算

++

递增(前缀)

--

递减(前缀)

+

一元 +

-

一元 -(非)

!

逻辑 NOT

~

按位 NOT

delete

删除属性

typeof

返回类型信息

void

返回未定义值

乘性运算符

乘性运算符对两个操作数执行乘、除或求模计算。

下表列出了所有的乘性运算符,它们具有相同的优先级:

运算符

执行的运算

*

乘法

/

除法

%

求模

加性运算符

加性运算符对两个操作数执行加法或减法计算。下表列出了所有加性运算符,它们具有相同的优先级:

运算符

执行的运算

+

加法

-

减法

按位移位运算符

按位移位运算符涉及两个操作数,它将第一个操作数的各位按第二个操作数指定的位数移位。下表列出了所有按位移位运算符,它们具有相同的优先级:

运算符

执行的运算

<<

按位左移位

>>

按位右移位

>>>

按位无符号右移位

关系运算符

关系运算符涉及两个操作数,它比较两个操作数的值,然后返回一个布尔值。下表列出了所有关系运算符,它们具有相同的优先级:

运算符

执行的运算

<

小于

>

大于

<=

小于或等于

>=

大于或等于

as

检查数据类型

in

检查对象属性

instanceof

检查原型链

is

检查数据类型

等于运算符

等于运算符涉及两个操作数,它比较两个操作数的值,然后返回一个布尔值。下表列出了所有等于运算符,它们具有相同的优先级:

运算符

执行的运算

==

等于

!=

不等于

===

全等

!==

不全等

按位逻辑运算符

按位逻辑运算符涉及两个操作数,执行位级别的逻辑运算。按位逻辑运算符具有不同的优先级;下表按优先级递减的顺序列出了按位逻辑运算符:

运算符

执行的运算

&

按位 AND

^

按位 XOR

|

按位 OR

逻辑运算符

逻辑运算符涉及两个操作数,这类运算符返回布尔结果。逻辑运算符具有不同的优先级;下表按优先级递减的顺序列出了逻辑运算符:

运算符

执行的运算

&&

逻辑 AND

||

逻辑 OR

条件运算符

条件运算符是一个三元运算符,也就是说它涉及三个操作数。条件运算符是应用 if..else 条件语句的一种简化方式。

运算符

执行的运算

?:

条件

赋值运算符

赋值运算符涉及两个操作数,它根据一个操作数的值对另一个操作数进行赋值。下表列出了所有赋值运算符,它们具有相同的优先级:

运算符

执行的运算

=

赋值

*=

乘法赋值

/=

除法赋值

%=

求模赋值

+=

加法赋值

-=

减法赋值

<<=

按位左移位赋值

>>=

按位右移位赋值

>>>=

按位无符号右移位赋值

&=

按位 AND 赋值

^=

按位 XOR 赋值

|=

按位 OR 赋值