ActionScript 2.0/运算符简介
关键概念
- 运算符
- 运算符类型
- 算术运算符
- 文本串联运算符
- 比较运算符
- 不同类型的比较
- 逻辑运算符
- 赋值运算符
- 两种类型的简单赋值
- 复合赋值运算符
- 增量和减量运算符
- 运算符优先级
- 运算符结合性
- 注释
- 表达式与语句
一个运算符通常是一个符号,比如 + 或 -,用来操作不同的实体。被操作的实体被称为操作数。如果你有编程、SQL 甚至简单计算机语言(如电子表格公式)的经验,你应该已经熟悉了很多运算符。在上一章,我们已经介绍了赋值运算符。在本章中,我们将详细介绍最常用的运算符。(注意:点和数组访问运算符也很有用,但我们将在后面学习属性和方法时再详细介绍。)
算术运算符是用来帮你进行数学计算的运算符。四种基本的算术运算符如下所示
- + 代表加法。
- - 代表减法。
- * 代表乘法。
- / 代表除法。
现在,你可能会想写这样的代码
代码 | 结果 |
---|---|
1 + 1;
|
|
然而,这会给你一个错误。这是因为 1 + 1 只是一个表达式,它的值为 2;它不是语句。(回想一下:语句告诉计算机做什么。)所以,我们应该这样写
代码 | 结果 |
---|---|
trace(1 + 1);
|
|
再次强调,现在先不用理解 'trace' 的含义。将这段代码输入到第一个帧的 ActionScript 中,然后预览你的 Flash 文件。'2' 应该会出现在输出框中。
除了上述之外,还有一个不太常用的运算符 %,它可以计算除法运算的余数。例如,10 % 3 返回 1。其他运算(如指数、平方根等)不能使用运算符进行计算,我们将在后面学习它们。
Flash 的一个特点是 + 既充当加法运算符,也充当文本串联运算符。文本串联运算符将两个字符串合并成一个。例如,将 "This is" 和 " Sparta" (注意 Sparta 前面的空格)串联起来,我们会得到 "This is Sparta"。然而,如果我们将 "This is" 和 "Sparta" 串联起来,我们会得到 "This isSparta",这是不希望的结果。
如果 + 号两侧的实体都是数字,则 + 将充当加法运算符。否则,+ 将充当文本串联运算符。以下是一个示例
代码 | 结果 |
---|---|
trace(1 + 1);
trace("1" + 1);
trace(1 + "1");
trace("1" + "1");
|
|
比较运算符是用来比较两个实体并返回一个布尔值的运算符。
等式运算符 (==) 比较两个实体,并确定它们是否完全相同。如果相同,它返回 true
;否则,它返回 false
。以下是一些示例代码
代码 | 结果 |
---|---|
trace(1 == 2);
trace(1 == 1);
trace("Hello world" == "Hello world");
trace("This is sparta!" == "This is Sparta!");
|
|
请注意,最后一个是 false,因为等式运算符区分大小写。
当我们处理复合数据类型时,我们需要更加小心。等式运算符只有在它们引用同一个实体时才会返回 true
。即使我们有两个不同的相同实体,等式运算符也会返回 false
。在这个例子中,假设有两条狗。一条叫 Spot,还有一个名字叫 Bandian(中文意思是“斑点”)。另一条叫 'Lucky',它们是双胞胎,在生理上完全相同。
代码 | 结果 |
---|---|
trace(spot == bandian);
trace(spot == lucky);
|
|
有时,我们会比较两个不同数据类型的实体,例如 23 和 "23"。在这种情况下,等式运算符仍然会返回 true
,因为它会自动将 "23" 转换为 23。如果你不想要这种自动转换,可以使用严格相等运算符 (===)。
代码 | 结果 |
---|---|
trace(23 == "23");
trace(23 === "23");
|
|
Flash 提供了多种不等式运算符,以满足你的所有比较需求。
第一个运算符是 !=。!= 与 == 相反:如果两个实体相等,它返回 false
,如果两个实体不相等,它返回 true
。请考虑以下代码
代码 | 结果 |
---|---|
trace(1 != 2);
trace("2" != 2);
|
|
你可能已经注意到 != 也会在必要时转换数据类型。如果你不希望发生这种情况,请使用 !==。
代码 | 结果 |
---|---|
trace("2" !== 2);
|
|
另外四个运算符是 <,>,<= 和 >=. 它们在数学中与 <,>,≤ 和 ≥ 相同。如果你需要快速复习,请看这里
- < 代表“小于”。
- > 代表“大于”。
- <= 代表“小于或等于”。
- >= 代表“大于或等于”。
看下面的例子
代码 | 结果 |
---|---|
trace(12 < 3);
trace(12 > 3);
trace(12 <= 3);
trace(12 >= 3);
trace(12 < 12);
trace(12 > 12);
trace(12 <= 12);
trace(12 >= 12);
|
|
我们也可以比较字符串。真的!字符串会被转换成它们的 Unicode 代码点 进行比较。请参阅 Unicode/字符引用/0000-0FFF 获取代码点信息。
代码 | 结果 |
---|---|
trace("Apple" > "Ball");
trace("Apple" < "Ball");
trace("apple" < "Ball");
trace("apple" != "apple");
|
|
对于相同大小写的字母,后面的字母的值比前面的字母的值大,所以 a < b 以及 A < B。然而,大写字母总是比小写字母的值小,所以 a > B。
和大多数语言一样,最重要的逻辑运算符是 AND、OR 和 NOT。
&& 是 ActionScript 的 AND 运算符。它的操作数必须是布尔值。如果两个操作数都是 true
,它返回 true
;否则,它返回 false
。
代码 | 结果 |
---|---|
trace(true && false);
trace(false && false);
trace(true && true);
trace(1>0 && 1=1);
trace(1<0 && 1=1);
|
|
|| 是 ActionScript 的 OR 运算符。它的操作数必须是布尔值。如果两个操作数都不是 true
,它返回 false
;否则,它返回 true
。
代码 | 结果 |
---|---|
trace(true || false);
trace(false || false);
trace(true || true);
trace(1>0 || 1=1);
trace(1<0 || 1=1);
|
|
请注意,AND 运算符必须使用两个“&”,OR 运算符必须使用两个“|”。[1]
! (发音为“bang”)是 ActionScript 的 NOT 运算符。它放在操作数之前。它会翻转布尔变量:false
变成 true
,true
变成 false
。
代码 | 结果 |
---|---|
trace(!false);
trace(!true);
trace(!true && true);
trace(!false && true);
|
|
我们已经在上一章中遇到了简单赋值运算符,但我们还需要澄清一些内容。简单赋值运算符实际上做了两件不同的事情
- 对于原始数据类型,赋值运算符只是将被赋值的值复制到变量中。
- 对于其他数据类型,赋值运算符会在变量中放入被赋值实体的链接!
这意味着什么?
代码 | 结果 |
---|---|
var string_1:String = "Wikibooks";
var string_2:String = string_1;
string_2 = "Wikipedia";
trace(string_1);
|
|
在这里,Flash 将值 "维基教科书" 复制到 string_2。在我们更改 string_2 为 "维基百科" 之后,原始 string_1 不会受到影响。考虑另一种情况,涉及非原始数据类型 Dog
代码 | 结果 |
---|---|
//Assume that spot is a chihuahua.
var nicestDog:Dog = spot;
nicestDog.species = "pekingese";
|
|
第一行是注释;我们将在本章结束时讨论它。您也不必理解第三行;只需假设它将nicestDog的物种更改为'北京犬'。现在,您是否认为将nicestDog的物种更改为'北京犬'会将一只名叫Spot的吉娃娃犬遗传地改变为北京犬?答案是肯定的。这是因为nicestDog只包含指向Spot的链接。
复合赋值运算符
[edit | edit source]有两种类型的复合赋值运算符。我们只讨论将赋值和算术运算符结合起来的那一种。如果您感兴趣,可以查看官方的Flash文档来了解另一种类型。
复合赋值运算符始终与数字一起使用。它们有五个,每个对应一个算术运算符
- +=,加法和重新赋值运算符
- -=,减法和重新赋值运算符
- *=,乘法和重新赋值运算符
- /=,除法和重新赋值运算符
- %=,模运算和重新赋值运算符
这些运算符的作用是对左操作数和右操作数执行运算,然后将值分配给左操作数。换句话说,
a += b;
等同于
a = a + b;
让我们用一个例子更好地理解这个概念。
代码 | 结果 |
---|---|
var number_1:Number = 5;
number_1 *= 2;
trace(number_1);
|
|
在这个例子中,Flash将number_1乘以5,然后将值分配给number_1。
赋值运算符返回什么?
[edit | edit source]到目前为止,我们已经看到算术运算符、逻辑运算符、比较运算符和文本连接运算符都返回一个值。既然赋值运算符本身可以是语句,那么它们是否不返回值呢?
事实上,赋值运算符确实返回值。赋值运算符返回的值是分配给左操作数的值。例如,a = 2
返回的值为2,而a /= 2
返回a原始值的一半。
以下代码可能看起来不直观,但它有效
代码 | 结果 |
---|---|
var a = 6;
var some_number:Number = 3 + (a += 1);
trace(some_number);
trace(a);
|
|
这里,a += 1
返回7。圆括号是为了允许在它内部的操作首先执行;我们将在后面讨论这一点。
增量运算符
[edit | edit source]ActionScript提供四个增量/减量运算符
- 后缀增量运算符,写成
variableName++
- 前缀增量运算符,写成
++variableName
- 后缀减量运算符,写成
variableName--
- 前缀减量运算符,写成
--variableName
增量运算符都将1加到整型变量中,而减量运算符都将1从整型变量中减去。它们本身是语句。例如
代码 | 结果 |
---|---|
var myFirstNumber:Number = 10;
myFirstNumber++;
trace(myFirstNumber);
myFirstNumber--;
trace(myFirstNumber);
++myFirstNumber;
trace(myFirstNumber);
--myFirstNumber;
trace(myFirstNumber);
|
|
如您所见,增量和减量运算符本身是语句。但是,我们有时希望将增量运算符放在另一个语句中。对于后缀增量/减量运算符,其他所有内容将在返回增量/减量之前进行评估。对于前缀增量/减量运算符,增量/减量将在其他所有内容之前进行评估。
如果听起来很混乱,请查看以下示例
代码 | 结果 |
---|---|
var myFirstNumber:Number = 10;
trace(myFirstNumber++);
trace(myFirstNumber);
|
|
代码 | 结果 |
---|---|
var myFirstNumber:Number = 10;
trace(++myFirstNumber);
trace(myFirstNumber);
|
|
在第一个例子中,myFirstNumber
在增量操作之前被跟踪。这就是为什么我们在第一个跟踪语句中仍然看到10的原因。第二个跟踪语句显示计算后的值11。
在第二个例子中,myFirstNumber
在增量操作之后被跟踪,因此我们已经可以在第一个跟踪中看到11。
运算顺序是什么?
[edit | edit source]还记得你在数学课上学习的运算顺序(PEMDAS或BOMDAS/BIMDAS)吗?ActionScript也以固定的顺序应用不同的运算符。
在ActionScript中,在确定运算顺序时,我们需要考虑两件事:运算符优先级和运算符结合性。
什么是运算符优先级?
[edit | edit source]当一个运算符总是先于另一个运算符进行评估时,我们称之为运算符优先级。
以下是对运算符优先级的一个简要概述
- 仅涉及一个操作数的运算符,例如NOT(!),是第一个被评估的。(如果您想知道,这些被称为一元运算符。)
- 接下来是*、/和 %。
- 然后是+和-。
- 然后是比较运算符。
- 然后是逻辑运算符AND和OR。
- 最后是赋值运算符。
如果我们希望某个运算具有更高的优先级,我们应该使用分组运算符,它是一对圆括号:()
。我们之前已经遇到过它,当时我们学习了赋值运算符。让我们再看一下那个例子
代码 | 结果 |
---|---|
var a = 6;
var someNumber:Number = 3 + (a += 1);
trace(someNumber);
trace(a);
|
|
这里,a += 1优先级更高,因为它被包含在圆括号中。
如果没有括号,它会导致错误
代码 | 结果 |
---|---|
var a = 6;
var someNumber:Number = 3 + a += 1;
trace(someNumber);
trace(a);
|
|
这是因为var someNumber:Number = 3 + a
首先执行。var someNumber:Number = 3 + a
返回的值为6。您不能将值分配给常量,否则世界将变得非常混乱!这就是为什么Flash会返回错误的原因。
什么是运算符结合性?
[edit | edit source]考虑表达式someNumber = 3 * 2 + 5 * 6
。3 * 2和5 * 6具有相同的优先级,那么哪一个应该先执行?运算符结合性回答了这个问题。在本例中,由于+的结合性为'从左到右',因此首先评估3 * 2,然后是5 * 6,最后是6 + 30。
+、-、*、/和 %运算符的结合性都是从左到右,而赋值运算符的结合性则是从右到左。
让我们运行一个包含许多运算符的脚本,以查看运算符优先级和结合性的影响。
代码 | 结果 |
---|---|
var someNumber:Number;
someNumber = 13 + 5 * 4;
trace(someNumber);
trace(1 + 3 / 5 != 2 && 4 - 3 >= 1);
|
|
在someNumber的赋值语句中,计算机首先评估5 * 4,然后是13 + 20。
第二个跟踪要复杂得多。这里优先级最低的运算符是&&,它的优先级甚至低于比较运算符。&&的结合性为从左到右,因此计算机需要首先评估&&左侧的代码(1 + 3 / 5 != 2
)。1 + 3 / 5 = 1.6,不等于2。因此,左侧返回的值为true
。现在到右侧。在4 - 3 >= 1
中,4 - 3 = 1,所以1 >= 1返回true
。由于&&的两侧都为真,因此跟踪语句返回true
。
如何添加注释?
[edit | edit source]现在我们已经学习了所有困难的运算符,让我们用一个非常简单的概念来结束本章。
注释是添加到脚本中以提供信息的一些文本。它们将被编译器忽略。以下示例显示了两种类型的注释
代码 | 结果 |
---|---|
/*This is just an example.
Don't actually copy-paste this into a Flash file.
There will be no visible results. */
var a = 6;
var someNumber:Number = 3 + (a += 1); //Assign the sum of 3 and a's new value to someNumber
|
|
第一个注释,用/*和*/括起来,允许多行。/*标记注释的开头,*/标记注释的结尾。这种类型的注释也可以添加到一行中间。它们广泛用于待办事项列表和版权信息等元素。
第二个注释以//开头,并添加到行尾。它不能跨越一行。这种类型的注释通常用于解释代码。
有时,我们可能希望'隐藏'一些代码用于测试或调试。这个过程称为注释掉,也是通过注释来实现的。
结论
[edit | edit source]现在我们已经学习了所有的运算符,我们可以继续下一章:函数。
- ↑ & 和 | 是有效的运算符(称为位运算符,但它们超出了本书的范围。