跳转至内容

ActionScript 2.0/运算符简介

来自维基教科书,开放世界中的开放书籍
ActionScript 2.0 简介
变量和数据类型 运算符 函数

关键概念


  • 运算符
  • 运算符类型
    • 算术运算符
    • 文本串联运算符
    • 比较运算符
      • 不同类型的比较
    • 逻辑运算符
    • 赋值运算符
      • 两种类型的简单赋值
      • 复合赋值运算符
    • 增量和减量运算符
  • 运算符优先级
  • 运算符结合性
  • 注释
  • 表达式与语句

一个运算符通常是一个符号,比如 + 或 -,用来操作不同的实体。被操作的实体被称为操作数。如果你有编程、SQL 甚至简单计算机语言(如电子表格公式)的经验,你应该已经熟悉了很多运算符。在上一章,我们已经介绍了赋值运算符。在本章中,我们将详细介绍最常用的运算符。(注意:点和数组访问运算符也很有用,但我们将在后面学习属性和方法时再详细介绍。)

哪些是很有用的运算符?

[编辑 | 编辑源代码]

算术运算符

[编辑 | 编辑源代码]

算术运算符是用来帮你进行数学计算的运算符。四种基本的算术运算符如下所示

  • + 代表加法。
  • - 代表减法。
  • * 代表乘法。
  • / 代表除法。

现在,你可能会想写这样的代码

代码 结果
1 + 1;

错误!

然而,这会给你一个错误。这是因为 1 + 1 只是一个表达式,它的值为 2;它不是语句。(回想一下:语句告诉计算机做什么。)所以,我们应该这样写

代码 结果
trace(1 + 1);

2

再次强调,现在先不用理解 '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");

2
11
11
11

比较运算符

[编辑 | 编辑源代码]

比较运算符是用来比较两个实体并返回一个布尔值的运算符。

等式运算符

[编辑 | 编辑源代码]

等式运算符 (==) 比较两个实体,并确定它们是否完全相同。如果相同,它返回 true;否则,它返回 false。以下是一些示例代码

代码 结果
trace(1 == 2);
trace(1 == 1);
trace("Hello world" == "Hello world");
trace("This is sparta!" == "This is Sparta!");

false
true
true
false

请注意,最后一个是 false,因为等式运算符区分大小写。

当我们处理复合数据类型时,我们需要更加小心。等式运算符只有在它们引用同一个实体时才会返回 true。即使我们有两个不同的相同实体,等式运算符也会返回 false。在这个例子中,假设有两条狗。一条叫 Spot,还有一个名字叫 Bandian(中文意思是“斑点”)。另一条叫 'Lucky',它们是双胞胎,在生理上完全相同。

代码 结果
trace(spot == bandian);
trace(spot == lucky);

true
false

有时,我们会比较两个不同数据类型的实体,例如 23 和 "23"。在这种情况下,等式运算符仍然会返回 true,因为它会自动将 "23" 转换为 23。如果你不想要这种自动转换,可以使用严格相等运算符 (===)。

代码 结果
trace(23 == "23");
trace(23 === "23");

true
false

不等式运算符

[编辑 | 编辑源代码]

Flash 提供了多种不等式运算符,以满足你的所有比较需求。

第一个运算符是 !=。!= 与 == 相反:如果两个实体相等,它返回 false,如果两个实体不相等,它返回 true。请考虑以下代码

代码 结果
trace(1 != 2);
trace("2" != 2);

true
false

你可能已经注意到 != 也会在必要时转换数据类型。如果你不希望发生这种情况,请使用 !==。

代码 结果
trace("2" !== 2);

true

另外四个运算符是 <,>,<= 和 >=. 它们在数学中与 <,>,≤ 和 ≥ 相同。如果你需要快速复习,请看这里

  • < 代表“小于”。
  • > 代表“大于”。
  • <= 代表“小于或等于”。
  • >= 代表“大于或等于”。

看下面的例子

代码 结果
trace(12 < 3);
trace(12 > 3);
trace(12 <= 3);
trace(12 >= 3);
trace(12 < 12);
trace(12 > 12);
trace(12 <= 12);
trace(12 >= 12);

false
true
true
true
false
false
true
true

我们也可以比较字符串。真的!字符串会被转换成它们的 Unicode 代码点 进行比较。请参阅 Unicode/字符引用/0000-0FFF 获取代码点信息。

代码 结果
trace("Apple" > "Ball");
trace("Apple" < "Ball");
trace("apple" < "Ball");
trace("apple" != "apple");

false
true
false
false

对于相同大小写的字母,后面的字母的值比前面的字母的值大,所以 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);

false
false
true
true
false

|| 是 ActionScript 的 OR 运算符。它的操作数必须是布尔值。如果两个操作数都不是 true,它返回 false;否则,它返回 true

代码 结果
trace(true || false);
trace(false || false);
trace(true || true);
trace(1>0 || 1=1);
trace(1<0 || 1=1);

true
false
true
true
true

请注意,AND 运算符必须使用两个“&”,OR 运算符必须使用两个“|”。[1]

! (发音为“bang”)是 ActionScript 的 NOT 运算符。它放在操作数之前。它会翻转布尔变量:false 变成 truetrue 变成 false

代码 结果
trace(!false);
trace(!true);
trace(!true && true);
trace(!false && true);

true
false
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);

10

在这个例子中,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);

10
7

这里,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);

11
10
11
10

如您所见,增量和减量运算符本身是语句。但是,我们有时希望将增量运算符放在另一个语句中。对于后缀增量/减量运算符,其他所有内容将在返回增量/减量之前进行评估。对于前缀增量/减量运算符,增量/减量将在其他所有内容之前进行评估。

如果听起来很混乱,请查看以下示例

代码 结果
var myFirstNumber:Number = 10;
trace(myFirstNumber++);
trace(myFirstNumber);

10
11

代码 结果
var myFirstNumber:Number = 10;
trace(++myFirstNumber);
trace(myFirstNumber);

11
11

在第一个例子中,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);

10
7

这里,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);

33
true

在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]

现在我们已经学习了所有的运算符,我们可以继续下一章:函数。

  1. & 和 | 是有效的运算符(称为位运算符,但它们超出了本书的范围。
华夏公益教科书