5. 变量值的类型
我们在ActionScript编程过程中所使用的数据有多种类型。迄今为止,我们已经看到过数字型和文本型,而诸如布尔、数组、函数,和对象等类型我们也将很快接触到。在我们触及每种数据类型的细节之前,先讨论一些与变量的使用密切相关的数据类型问题。 1.自动定义类型 在ActionScript中,任何变量都可以包含任何类型的数据。这看起来不值得注意,但是,某个变量中可以包含任何类型的数据的能力实际上是很不寻常的。象C++和Java这样严谨的编程语言使用既定义类型的变量;也就是说每个变量只能接受一种既定类型的数据,而此种类型必须在变量声明时明确指定。ActionScript变量是自动定义类型的变量 —— 当我们为某个变量赋值时,解释器为我们设置该变量的数据类型。
ActionScript变量不仅能包含任何数据类型,而且它们可以动态地改变数据类型。如果我们为某个变量赋一个新值,而该值与该变量原有值的类型不同,则该变量自动地被重新定义类型。综上所述,下面的代码在ActionScript中是合法的: x = 1; // x is a number x = "Micheal"; // x is now a string x = [4, 6, "hello"]; // x is now an array x = 2; // x is a number again
在C++和Java这样的编程语言中,自动地重新定义类型是不被支持的,类型不匹配的数据将被转换为变量现有的数据类型(或者会导致错误的发生 —— 如果该转换无法完成),而转换后的数据我们认为是不确定的(无法控制的)。在接下来的部分中我们将考虑自动定义类型和动态转换类型的一些重要概念。
2.自动的值转换 在某些环境中,ActionScript期待某种特定类型的数据。如果我们使用某个变量而该变量的数据值与期待的类型并不匹配,那么解释器会尝试转换该数据。例如,我们在需要数字的地方使用文本变量,为了适应当前的作业,解释器将试图转换该变量的文本值为某个数字值。在下面的例子中,z被设置为2。为什么?因为减号运算符(或称操作符,这两种说法并无明显区别,我将根据上下文关系来决定使用恰当的称呼)期待的是一个数字,所以变量y的值从字符串“4”转变为数字4,然后被6(x的值)减,产生结果2。 x = 6; // x is a number, 6 y = "4"; // y is a string, "4" z = x - y; // this sets z to the number 2
相反地,如果在某个期待字符串的地方我们使用数字变量,解释器则尝试将该数字转换为一个串。在下例中,z被设置为串“64”,而非数字10。这又是为什么呢?因为表达式x + y中的第二个操作数是个串,因此,加号运算符完成的是串连接而不是算术运算中的加法。x的值(数字6)被转变为串“6”,然后与串“4”(y的值)相连接,产生结果“64”。 x = 6; // x is a number, 6 y = "4"; // y is a string, "4" z = x + y; // this sets z to the string "64"
自动的类型转换发生在对作为表达式的组成部分的某个变量求值的时侯,转换的对象是该变量中所含数据的一个副本 —— 并不影响原始的变量类型。某个变量的类型只有在该变量被赋予某个与其现有值的类型不匹配的数据值时才发生根本转变。不好,不好,这太繁琐太复杂了,我写起来困难,你看着更是一头雾水,我们把这几句话打散,力求简洁明了。从上述两个例子开始:x + y和x - y是两个表达式,而变量x和y分别是表达式的组成部分,在语句z = x + y;和z = x - y;中,为了得到变量z的值,我们必须先对x和y求值,但是,在这两个语句中,变量x和变量y的类型分别是数字型和字符串型,也就是说两个操作数的数据类型不一致(不匹配),因此,就发生了自动的类型转换(解释器根据上下文环境决定变量所包含数据的类型),重要的是,你必须记住:此时被转换了类型的数据并不是变量所包含的原始数据,而是该原始数据的一个副本;换句话说,变量的类型并未改变,改变的只是变量中所包含的数据的一个副本的类型。既然如此,我们应该更进一步,了解变量的类型何时发生转变;举例说明,在赋值语句:x = 6;中,变量x此时的类型是数字型(一目了然),如果我们随后再次为变量x赋值:x = "abc";,现在,x的类型不再是数字型,而是字符串型(我们有时也称其为文本串型)。总结一下,变量x的原类型为数字型,再次赋值后变为字符串型,这是因为变量x最后被赋予的值("abc")的类型与此前变量所包含的值(6)的类型不一致,因此,出现了动态转换变量类型的情况,变量的类型发生了根本地转变。再回到上面两个例子中,因为并未对变量x和y重新赋值(赋不同类型的值),所以y最终仍保持为字符串型,而x也保持为数字型。
我想你一定注意到在上述两个例子中操作符的不同表现,z = x + y;和z = x - y;中的两个操作符(加号“+”和减号“-”)对这两个赋值语句有着意义深远的影响。在z = x - y;中,y的串值“4”转换成为数字值4;而在z = x + y;中,发生了相反的情况,x的数字值6变成串值“6”。这是因为对于操作符“+”和操作符“-”来说,存在着迥然而异的数据类型转换规则。我们将在以后的章节中详细讨论数据类型转换规则以及操作符。
3.手工确定类型 自动的数据类型定义和转换会带来便利,但是,正如上述例子中所描述的那样,可能会产生意外的结果。对不同类型的数据或变量进行操作的命令在开始执行之前,你或许想要首先确定某个变量的数据类型;此时可以使用typeof操作符: productName = "Macromedia Flash"; // string value trace (typeof productName); // displays: "string" on the Output window when you run the script
一旦我们知道了某个变量的类型,我们可以有选择地进行下一步处理。例如,在运行某段代码之前我们先检查该代码段中的某个变量是否是数字型: if (typeof age == "number") { // okay to carry on } else { trace ("age isn't a number"); // display an error message }
关于typeof操作符的所有细节我们将在以后专门讨论。
出处:蓝色理想
责任编辑:无意
上一页 变量(4)- 变量值的改变和取回 下一页 变量(6)- 变量的作用域
◎进入论坛Flash专栏版块参加讨论
|