第三节 创建并分类数据 有两种方式可以在ActionScript中创建新数据,这两种方法都需要使用表达式,即我们在脚本中表述数据的代码片语。Alvin注:有关表达式的概念在各种计算机语言的书籍中都有介绍,尽管各自措辞不同,但是基本都有一个确定的共识,那就是表达式是可以对其求值的任何语句。比如:变量hello本身就是一个表达式,对该表达式求值的结果就是hello中所包含的数据值;而数字2345也是一个表达式,该表达式的值就是数字2345本身。
字面表达式(简称为字面,很多计算机书籍中都称其为字面常量)是一系列的字母、数字,以及作为数据的标点符号。数据字面的表现形式是程序源文件中的数据的逐字表示法。它与变量对比 —— 上一章中介绍过 —— 变量仅是包含数据的容器。每种数据类型都定义了其自己的字面创建规则。下面是一些字面的例子: "loading...please wait" // a string literal 1.51 // a number literal ["jane", "jonathan"] // an array literal
请注意,电影剪辑无法用字面表述,但是可以通过实例名被引用。
我们也能够利用某个复合表达式程序化地产生数据。复合表达式以代码片语的形式表述数据,该代码片语必须能被计算求值,而非仅是逐字的表达。例如,下列这些复合表达式都以产生一个单数据为结果: 1999 + 1; // yield the datum 2000 "hi " + "ma!" // yield the datum "hi ma!" firstName // yield the value of the variable firstName _currentframe // yield the frame number of the playhead's current position new Date () // yield a new Date object with the current date and time
注意上述所列的例子中,个体的字面表达式,比如1999和1,可以成为复杂的表达式的有效组成部分,比如1999 + 1。
无论我们使用字面表达式还是复合表达式来创建数据,都必须将我们想要在以后使用的每个数据加以存储。举例说明:表达式"hi " + "ma!"的值将会丢失,除非你存储它,比如说,存于一个变量中。如: // this datum is fleeting, and dies immediately after it's created "hi " +"ma!";
// this datum is stored in a variable and can be // accessed later via the variable's name var welcomeMessage = "hi " + "ma!";
我们如何将数据分类到适当的类型中?也就是说,我们怎样将某个数据指定为数字、字符串、数组,或其他的什么类型?在大多数情况下,不需要我们亲自分类新数据;ActionScript解释器会自动地指派或推断出每个数据的类型 —— 这当然是基于一套内部规则。
1.自动定义字面的类型 通过检查某个字面数据的语法,解释器可以推断出它的类型。如同下列代码片段的注释中所解释的那样: "animal" // quotation marks identify "animal" as a string 1.35 // if it contains only integers and a decimal, it is a number true // special keyword true identifies this as a boolean null // special keyword null identifies this as a null type undefined // special keyword undefined identifies the undefined type
["hello", 2, true] // square brackets and values separated by commas indicate that this is an array {x: 234, y: 456} // curly braces and property name/value pairs separated by commas indicate that this is an object
如你所见,对数据字面使用正确的语法是极其重要的。不正确的语法会引起错误的发生或者导致对数据内容的曲解。如例: animal // missing quotes -- animal is interpreted as a variable, not a string of text "1.35" // numbers in quotes are treated as strings, not numbers 1. 35 // space before the 3 causes an error "animal // missing closing quotation mark causes an error
2.自动定义复合表达式的类型 解释器计算表达式的值以便确定其数据类型。考虑下面的例子: pointerX = _xmouse;
因为_xmouse将鼠标指针的位置以数字形式存储,表达式_xmouse的类型总是数字型,因此,变量pointX也成为数字型。
数据类型被解释器自动地确定 —— 通常,这符合我们的要求和期望。但是,某些意义暧昧的事例需要我们理解一些规则;而这些规则被解释器用来确定某个表达式的数据类型。考虑下面的表达式: "1" + 2;
加号左边的操作数是一个字符串("1"),而右边的操作数是一个数字(2)。加号操作符作用于所有的数字(加法)和字符串(串联)。那么表达式"1" + 2的值到底是数字3还是字符串"12"?为了明确这些模糊之处,解释器依赖于一个固定的规则:加号操作符(+)对字符串的支持总是处于数字之前。所以,该表达式求值的结果是字符串"12"而不是数字3。这个是一个专横的规则,但是它提供了一种解释代码的协调的方式。你应当记住作为加号操作符的典型用法的该规则被启用于:当有一个操作数是字符串时。该规则适用于连接操作数,而非数字的相加,如下例所示: trace ("the value of x is: " + x);
连接类型迥异的数据或在某个上下文关系中使用一个与期待的数据类型不匹配的数据会产生暧昧的语义。这迫使解释器根据专断却可预知结果的规则进行自动的数据类型转换。让我们考察一些发生自动转换的事例,以及一片数据从一种类型转换为另一种类型的预期结果是什么。
to be continue... alvin
出处:蓝色理想
责任编辑:无意
上一页 数据和数据类型(2) - 用数据类型来保留意义 下一页 数据和数据类型(4) - 数据类型转换
◎进入论坛Flash专栏版块参加讨论
|