跳转到内容

ActionScript 2.0 入门/基本数据类型

来自维基教科书,开放的书籍,面向开放的世界
ActionScript 2.0 入门
事件处理 基本数据类型 数组

关键概念


  • 包装类
  • 基本数据类型的字面量与包装类的实例
  • instanceof 和 typeof
  • 字符索引
  • 子字符串
  • 其他 String 方法
  • 科学记数法和十六进制数
  • 无穷大、最大值和最小值以及 NaN
  • 关于转换的更多信息
  • 静态属性和方法
  • 常量变量

在脑海中塞满所有这些基本概念之后,你应该休息一下!本章将介绍基本数据类型。

什么是包装类?

[编辑 | 编辑源代码]

一个包装类,就是“包装”了三种基本数据类型,并添加了属性和方法的类。不出所料,共有三种包装类,分别对应三种基本数据类型。

  • Number
  • String
  • Boolean

每个类都有一个构造函数,可以用来初始化它。用构造函数初始化数字、字符串或布尔值,但没有任何参数,将会返回一个空白值,即零、空字符串和空布尔值。

代码 结果
trace(new Number());
trace(new String());
trace(new Boolean());

0

false

虽然跟踪结果为 true,但 new Boolean() 既不是 true 也不是 false。

你也可以将字面量放在第一个参数中

代码 结果
trace(new String("Hello world!"));
trace(new Number(123));
trace(new Boolean(true));

Hello world!
123
true

“字符串”和“字符串对象”之间存在细微差别。请看下面的例子

代码 结果
trace(123 instanceof Number);
trace(new Number(123) instanceof Number);
trace(typeof 123);
trace(typeof new Number(123));

false
true
string
object

instanceof 和 typeof 是特殊的运算符。instanceof 如果左操作数是右操作数的实例,则返回 true。在本例中,123 不是 Number 的实例,但 new Number(123) 是。typeof 返回右操作数的数据类型,可以是 string、number、boolean、function、movieclip 或 object(对于非 MovieClip 对象)。小写字母是故意的,因为这是 typeof 返回的值。在本例中,123 是基本数据类型 number,但 new Number(123) 是 Number 包装类的实例。

Flash 会在必要时将包装类的实例转换为基本数据,反之亦然。如果我们想手动将包装类的实例转换为基本数据类型,可以使用 valueOf() 函数

代码 结果
trace(new Number(123).valueOf() instanceof Number);

false

要进行反向转换,只需调用构造函数即可。

如何操作字符串?

[编辑 | 编辑源代码]

你只需要了解的唯一字符串属性是 length 属性,它显示字符串中的字符数。例如

代码 结果
trace("Hello world!".length);

12

请注意,空格也计入在内。

你需要了解的另一件事是,字符串中字符的位置称为其索引。如果索引是正数,则从第一个字符开始计数;如果索引是负数,则从最后一个字符开始计数。第一个字符定义为 0,最后一个字符定义为 -1。例如,'spot' 中 'p' 的索引为 1 或 -3,'o' 的索引为 2 或 -2。现在让我们开始操作字符串!

如何在字符串中定位字符?

[编辑 | 编辑源代码]

以下函数与 ActionScript 中的字符有关

  • String.fromCharCode(代码点 1, 代码点 2...)
  • string.charAt(字符的索引);
  • string.charCodeAt(字符的索引);

fromCharCode 使用参数中指定的 Unicode 代码点返回一个字符串。请注意,我们写了 'String.fromCharCode'。这正是你应该键入的方式!这是因为 fromCharCode 是一个静态方法,这意味着它属于整个类,而不仅仅是特定字符串。

charAt 返回指定位置的字符,而 charCodeAt 返回指定字符的 Unicode 代码点。

例如

代码 结果
trace(String.fromCharCode(62, 56, 123));
trace("Hello world!".charAt(4));
trace("Hello world!".charCodeAt(4));

>8{
o
111

请记住,ActionScript 使用 Unicode 代码点而不是 ASCII 代码点进行字符串操作。ASCII 代码点将在后面派上用场。

什么是子字符串?

[编辑 | 编辑源代码]

一个子字符串是另一个字符串内的字符串。当我们知道子字符串在一个字符串中的位置时,有三种方法可以找到它

  • string.substr(第一个字符的索引, 长度);
  • string.substring(第一个字符的索引[, 最后一个字符的索引]);
  • string.slice(第一个字符的索引[, 最后一个字符的索引]);

如果你熟悉 SQL 或电子表格,你可能会注意到这两个函数与 SQL 或电子表格中的 SUBSTRING()/SUBSTR()/MID() 等函数有很大不同,因为字符串没有在第一个参数中指定,因为它是包含方法的字符串本身。

请注意,最后一个字符在 substring() 和 slice() 中被排除在子字符串之外。如果没有指定最后一个字符的索引,Flash 将返回所有内容到结尾。以下是所有三个函数的示例

代码 结果
trace("Hello world!".substr(4, 5));
trace("Hello world!".slice(4, 9));
trace("Hello world!".substring(4, 9));
trace("Hello world!".slice(4));
trace("Hello world!".substring(4));

o wor
o wor
o wor
o world!
o world!

有时,我们需要在字符串中找到已知子字符串的位置。然后我们需要这两个函数

  • string.indexOf(substring[, 第一个字符的索引]);
  • string.lastIndexOf(substring[, 最后一个字符的索引]);

indexOf 非常类似于电子表格中的 FIND()。它从第二个参数中指定的字符开始,在字符串中查找子字符串。如果第二个参数为空,则从开头开始查找。返回子字符串第一次出现的第一个字符的位置。lastIndexOf 几乎相同,只是它返回最后一次出现的位置,而不是第一次,并且你指定停止查找的位置,而不是开始查找的位置。搜索区分大小写。如果未找到任何匹配项,Flash 将返回 -1。例如

代码 结果
trace("Tralalalala".indexOf("la", 4));
trace("Tralalalala".indexOf("la"));
trace("Tralalalala".lastIndexOf("la", 8));
trace("Tralalalala".lastIndexOf("la"));
trace("Tralalalala".lastIndexOf("lah"));

5
3
7
9
-1

其他一些 String 方法?

[编辑 | 编辑源代码]
  • toString(转换目标) 是将内容转换为字符串的另一种方法。它与 String(转换目标) 几乎相同,我们在第 1 章中已经遇到过。
  • concat(string1, string2...) 也与文本连接运算符的作用几乎相同。
  • string.toUpperCase 和 string.toLowerCase 分别将指定的字符串转换为大写和小写。令人惊讶,对吧?
  • string.split(分隔符, 元素数量) 将在下一章中介绍。

如何开始新行?

[编辑 | 编辑源代码]

newline 是一个字符串字面量,可以帮助你开始新行。它没有用引号括起来;而是与其他字符串连接在一起。

代码 结果
trace("Hello!" + newline + "World!");

Hello!
World!

如何在其他记数系统中表达数字?

[编辑 | 编辑源代码]

ActionScript 以一种与计算器非常相似的方式以科学记数法表示数字。字母 'e' 添加在 10x 部分和数字之间。你不需要确保第一个数字在 1 到 10 之间,也不需要在指数前添加正号 (+),因为 Flash 会自动为你完成。Flash 也会在适当的时候将数字转换为科学记数法和从科学记数法转换。

代码 结果
trace(123e15);
trace(1.23e-2);
trace(10000000000000000000000000000000000);

1.23e+17
0.0123
1e+34

要以十六进制数表示数字,只需在十六进制数之前键入 '0x'。Flash 会将其转换为十进制数。

代码 结果
trace(0x12A);

298

十六进制数在以后处理颜色时会非常有用。

一些特殊的数字是什么?

[编辑 | 编辑源代码]

除了我们操作的常规浮点数和小数外,ActionScript 还有五个特殊数字,它们都是 Number 的**静态属性**。

  • Number.NEGATIVE_INFINITY
  • Number.POSITIVE_INFINITY
  • Number.MAX_VALUE
  • Number.MIN_VALUE
  • Number.NaN

类似于静态方法,静态属性属于整个类,而不是单个实例。它们也通过类名而不是实例名访问。请注意,这些数字全部大写并用下划线(_)分隔。这是因为它们是**常量**。虽然常量是变量,但它们不应更改;它们的存在是因为每次使用字面量都是不可行的。

Number.NEGATIVE_INFINITY、Number.POSITIVE_INFINITY 和 Number.NaN 的字面量分别是 -Infinity、Infinity 和 NaN。

Number.MAX_VALUE 和 Number.MIN_VALUE 分别是 Flash 中最大的整数值和最小的十进制值。Number.NEGATIVE_INFINITY 和 Number.POSITIVE_INFINITY 分别表示负无穷大和正无穷大。Number.NaN 表示“非数字”。当你尝试将非数字视为数字时,你可能已经得到过这个值,例如以下情况

代码 结果
trace(123 - "Hello world!");

NaN

请记住,无论你从无穷大中减去多少,或将它分成多少份,无穷大始终是无穷大。还要记住,除以零不会导致未定义或 NaN,而是无穷大。

代码 结果
trace(Number.POSITIVE_INFINITY / Number.MAX_VALUE);
trace(Number.POSITIVE_INFINITY - Number.MAX_VALUE);
trace(12 / 0);

Infinity
Infinity
Infinity

两个全局函数 isFinite(number) 和 isNaN(number) 可以帮助你分别确定一个数字是否为无穷大和 NaN。isFinite 如果数字是有限的则返回 true,否则返回 false;isNaN 如果参数是有效数字则返回 false,否则返回 true。

代码 结果
trace(isFinite(Infinity));
trace(isFinite(-Infinity));
trace(isFinite(12/0));
trace(isFinite(Number.MAX_VALUE));
trace(isNaN(45 * "Hello world!"));
trace(isNaN("Hello world!"));
trace(isNaN(-12/0));

false
false
false
true
true
true
true

请注意,最后一个结果为真,因为“Hello world!”不是数字(而是字符串)。我们将在 Math 类章节中更详细地介绍。

关于转换的一句话

[编辑 | 编辑源代码]

在第一章中,我们学习了如何在基本数据类型之间进行转换。让我们再看一下每个转换过程。

让我们从 String(value) 开始。如果我们尝试转换 MovieClip 或 TextField,它将被转换为 'leveln_instanceName' 的形式,例如 level0_someMovieClip 指的是主时间轴上的一个 MovieClip。如果我们尝试转换数组,结果字符串将包含用逗号分隔的所有元素。如果我们尝试转换任何其他对象,我们将得到 [object Object],如果我们尝试转换函数,我们将得到 [type Function]。

代码 结果
//Assume that someMovieClip is a MovieClip on the stage.
trace(String(new Array(12, 32, 34)));
trace(String(someMovieClip));
trace(String(new Sound));
trace(String(someFunction));
function someFunction():Void{
	return;
}

12,32,34
_level0.someMovieClip
[object Object]
[type Function]

如果我们在 Number(value) 中放入除 true、false 或仅包含数字的字符串以外的任何东西,我们将得到 NaN。

如果我们在 Boolean(value) 中放入除 0 或 1 以外的任何东西,如果该东西为空或未定义,我们将得到 false,否则我们将得到 true。

将字符串转换为整数的另一种方法是使用 parseInt 全局函数。第一个参数是字符串,第二个可选参数是数字系统的基数。

代码 结果
trace(parseInt("13.6"));
trace(parseInt("0x14"));
trace(parseInt("1.23e-3"));
trace(parseInt("001101", 2));

13
20
1
13

请注意,我们不需要第二个参数用于第二个 trace,因为 0x 已经暗示基数为 16。

现在我们已经了解了所有基本数据类型,我们将学习如何操作数组。

华夏公益教科书