2007/04/23 | 第2章 强类型 转载(http://www.flashxm.com/)
类别(flash) | 评论(0) | 阅读(109) | 发表于 09:30

生存还是死亡
·设置何种类型的变量可以访问:字符串,数字,数组等等。
·如果错误数据试图进入时抛出一个错误。

如果你来自于脚本世界(JavaScript或ActionScript),你可能连数据类型是什么或为何担心都不太清楚。说实话,你并不是不得不去注意,但这将帮助你成为一个更好的程序员(或者说至少更加彻底些)。
变量的数据类型有:字符串、数字、数组、对象、布尔型等等。在AS1里,你如下赋值就没有问题:
var template = "catalog";
trace(template);
template = 5;
trace(template);
输出如图2.1所示。
事实上,这些途径依然在MX2004工作。然而,它是不好的编程习惯。劣质的!一般来讲,变量应该不要改变其类型,否则将使你的代码非常混乱。
强数据类型就像:
var template:String = "catalog";

常见问题解答
为何强制数据类型是良好的编辑习惯?
它真的只是拯救你自己,偏执的家伙。它至少促使你比较绅士地使用变量,这通常意味着较少犯错。或者说,它让下一个程序员比较容易读得一致。(“下一个程序员”习惯表示某个印度的家伙,但这里我认为是菲律宾或俄罗斯的女郎)

这段代码表示template变量必须是一个字符串。如果你试图把它变成别的什么,Flash会抛出一个错误。例如,试试这个:
var template:String = "catalog";
trace(template);
template = 5;
trace(template);
你将会看到图2.2。

图2.2 强数据类型发挥作用

这里将会发现什么呢?
var bar:Number;
var barNone = bar/2;
barNone = "bayToBreakers";
trace(barNone);
你将会获得错误信息吗?barNone是否会从bar继承数字类型呢?测试影片,你将获得显示输出如图2.3。

图2.3 没有错误字符串类型继承

没有错误。虽然bar被强行定义为数字类型,但barNone干脆没有。如果你想确定barNone坚持为数字类型,你必须使用如下代码:
var bar:Number;
var barNone:Number = bar/2;
barNone = "bayToBreakers";
trace(barNone);
现在测试影片,你会获得一个错误。
没错儿,起初强类型是有点痛苦。然而,以后它就像解救自己时,导致了小的痛苦。它就像快速的流感。
但是…
不要愚蠢地无论什么时候都强类型你的变量。有时你的变量保持自由、散漫或无论他们感觉像什么都也是有益的。这也是脚本语言的一个优势。通常,我喜欢测定我的变量类型除非我有理由不这么做(例如我懒了)。

2.1 强类型和代码提示
强类型也有助于代码提示。当你在脚本面板工作时,你可能注意到Flash有时可以领会到你正在输入什么并且给你一些选项( 如图2.4)。

图2.4 Flash有时提供选项

如果你强定义了一个变量,那么Flash就知道有什么类型的方法对你的变量起作用。例如,如果你创建一个字符串,你就可以使用indexOf(),split(),和toLowerCase()。(如图2.5。)

图2.5 Flash列出了变量的可用方法

这不是什么优厚的待遇,但是它很方便。
如此,你就会问,我可以用哪些数据呢?除了Array、String和Object之外都有些什么?
Oh, my, I say, a fantabulous plethora (actual Englishsilly, but correct).
Accordion DataHolder Label
Alert DataSet List
Array DataType LoadVars
Binding Date LocalConnection
Button DateChooser Log
Camera DateField MediaController
Checkbox Delta MediaDisplay
Color DeltaItem MediaPlayback
ComboBox DeltaPacket Menu
ComponentMixins EndPoint MenuBar
CustomActions Error Microphone
DataGrid Function MovieClip
MovieClipLoader RDBMSResovler Tree
NetConnection ScrollPane TypedValue
NetStream SharedObject Void
Number Slide WebServiceConnector
NumericStepper SOAPCall Window
Object Sound XML
PendingCall String XMLConnector
PopUpManager TextArea XMLNode
PrintJob TextField XMLSocket
ProgressBar TextFormat XUpdateResolver
RadioButton TextInput
RadioButtonGroup TextSnapshot

如果你正好向某人介绍强类型,这些你将只使用一点点,尽管大部分很可能会是Array, Color, Date, LoadVars, MovieClip, Number, Object, Sound, String, 和XML,不要害怕进行实验。
更多途径获得那些宝贵的代码提示
你可以在变量名后面加上特殊的后缀告诉Flash说“这是一个String”或“这是一个Object”。那么Flash将为你显示适当的代码提示。例如,下面的代码提示即将显示。(如图2.6)
var warning_array = new Array();
warning_array.

图2.6 Flash提供代码提示

注意这个不是强类型。它只不过使用的特定的变量名将代码提示显示出来。如果你输入如下代码将没有错误发生:
var warning_array = new Array();
warning_array = "hi there";
同样注意,如下的代码不起作用:
var warning_array;
warning_array.
这样没有代码提示,伙计。
在某些程序设计语言里,强类型允许程序运行得更快。ActioScript并非如此,甚至连一点点都不影响它的执行。
那又如何?
这并不是那个大人物,真的吗?如果你已经在喜欢在Flash Action面板中编写代码,那么代码提示偶尔是有帮助的。如果那是你的偏爱,这里配合Acton面板有一个简单的方法。
1. 将Action面板与其它面板分离,让它是自由浮动的。
2. 重新设置面板的大小,你能设多大就设多大,像图2.7。

图2.7 大的,自由浮动的Action面板

3. 按F9,面板消失,再按F9,再显示。
如果你喜欢这样编程的话Give it a shotsee。我有点喜欢。

2.2 哄骗Flash
你不一定非得做,但这是一种绕过强类型的方法。
var numTrees:Number = 5;
trace(numTrees); // displays "5"

var treeHack = "numTrees";
this[treeHack] = "leafy green"; // no error happens
trace(numTrees); // displays "leafy green"
为何?
ActionScript就像结合的数组(结合数组使用字符串代替了数字索引,就像myArray["ice"]代替myArray[3]),这样它就无法确定变量treeHack的类型。这是一个变量,并且变量可以改变,于是Flash不能确定treeHack将是什么东西。



0

评论Comments

日志分类
首页[223]
javascript[29]
asp[62]
常识[12]
SQL[8]
文学[2]
Dreamweaver[22]
网页设计[25]
flash[20]
片言碎语[21]
php[6]
web standard[16]