- ActionScript 3.0從入門到精通(視頻實戰版)
- 蔣國強 岳元亞等編著
- 391字
- 2018-12-31 19:52:46
第3章 AS 3.0程序設計
任何一門編程語言都要設計程序問題,ActionScript 3.0也不例外。本章將介紹ActionScript 3.0中代碼的基本語句以及程序設計的一般過程。首先介紹程序控制的邏輯運算,然后著重介紹條件語句和循環語句。
3.1 邏輯運算
在程序設計的過程中,要實現程序設計的目的,必須進行邏輯運算。只有進行邏輯運算,才能控制程序不斷向最終要達到的目標前進,直到最后實現目標。
邏輯運算又稱為布爾運算,通常用來測試真假值。邏輯運算主要使用條件表達式進行判斷,如果符合條件,則返回結果true;不符合條件,返回結果false。
條件表達式中最常見的形式就是利用關系運算符進行操作數比較,進而得到判斷條件。
當然,有些情況下需要控制的條件比較多,那么就需要使用邏輯表達式進行邏輯運算,得到一個組合條件,并控制最后的輸出結果。
常見的條件表達式舉例如下:
?(a>0):表示判斷條件為a>0。若是,返回true;否則返回false。
?(a==b)&&(a>0):表示判斷條件為a大于0,并且a與b相等。若是,返回true,否則返回false。
?(a==b)||(a>0):表示判斷條件為a大于0,或者a與b相等。若是,返回true,否則返回false。
邏輯運算執行的最終結果,就是返回一個Boolean型的變量true或者false,然后按照程序的要求,執行相應的操作。
3.2 程序的3種結構
在程序設計的過程中,如果要控制程序,應安排每句代碼執行的先后次序,這個先后執行的次序稱為“結構”。常見的程序結構有3種:順序結構、選擇結構和循環結構。本節將分別介紹一下這3種程序結構的概念和流程。
3.2.1 順序結構
順序結構最簡單,就是按照代碼的順序,一句一句地執行操作,結構如圖3.1所示。

圖3.1 順序結構
ActionScript代碼中的簡單語句都是按照順序進行處理的,這就是順序結構。請看下面的示例代碼:
//執行第一句代碼,初始化一個變量 var a:int; //執行第二句代碼,給變量a賦值數值1 a=1; //執行第三句代碼,變量a執行遞加操作 a++;
3.2.2 選擇結構
當程序有多種可能的選擇時,就要使用選擇結構。選擇哪一個,要根據條件表達式的計算結果而定。結構如圖3.2所示。

圖3.2 選擇結構
舉個簡單的例子,使用if...else語句實現這樣的效果。如果現在時間超過了22點,就停止寫作,否則繼續寫作。程序代碼如下所示:
if(現在時間>22點){ 停止寫作 }else{ 繼續寫作 }
3.2.3 循環結構
循環結構就是多次執行同一組代碼,重復的次數由一個數值或條件來決定。結構如圖3.3所示。

圖3.3 循環結構
循環結構只是包含了選擇結構,因為它要判斷是否符合條件,如果符合條件才會執行代碼,否則就會跳出循環,執行后面的代碼。對編程過程來說,循環結構能夠節約程序代碼,提高執行效率。例如,要在輸出面板輸出0~9這10個數,不使用循環結構,代碼只能這樣寫:
trace(0); trace(1); trace(2); trace(3); trace(4); trace(5); trace(6); trace(7); trace(8); trace(9);
要寫10行代碼才能完成,而使用循環結構,只需用3行就可以實現相同的效果。代碼如下所示:
for (var i:uint; i<10; i++) { trace(i); }
3.3 選擇程序結構
選擇程序結構就是利用不同的條件執行不同的語句或者代碼。ActionScript 3.0有3個可用來控制程序流的基本條件語句,分別為if...else條件語句、if...else if...else條件語句、switch條件語句。本節將詳細講解這3種不同的選擇程序結構。
3.3.1 if...else 條件語句
if...else條件語句判斷一個控制條件,如果該條件能夠成立,則執行一個代碼塊,否則執行另一個代碼塊。
if...else條件語句基本格式如下:
if(表達式){ 語句1; } else { 語句2; }
說明
如果表達式的值為真,就執行語句1,否則就執行語句2。
下面使用if...else條件語句實現年份是否為閏年的判斷。
由分析可知,閏年的判斷條件有以下兩條:
?當年份能被4整除,且不能被100整除,則該年為閏年。
?當年份能被4整除,又能被400整除,則該年為閏年。
如果年份滿足上述兩個條件中的一個就是閏年。
若用year來表示存放年份的變量,則條件可以表示為:
(year%400==0)||(year%4==0)&&(year%100!=0)
完成后的代碼如下所示:
var year:int=2008; if ((year%400==0)||(year%4==0)&&(year%100!=0)) { trace("今年是閏年"); } else { trace("今年不是閏年"); }
如果只是想在滿足某個條件時執行操作,而不滿足時不執行操作,可以省略else語句。格式如下所示:
if(表達式){ 語句; }
3.3.2 if...else if...else語句
if...else條件語句執行的操作最多只有兩種選擇,如果有更多的選擇,那就可以使用if...else if...else條件語句。
if...else if...else語句格式如下:
if(表達式1){ 語句1; } else if (表達式2){ 語句2; } else if (表達式3){ 語句3; } . . . else if (表達式n){ 語句n; } else{ 語句 m; }
可以通過使用多個else?if來進行多個條件的判斷,最后的else語句塊可有可無(根據實際需要選用)。但是,這種多層條件判斷語句在層次太多時執行速度較慢。另外如果條件過多,在編程的時候容易出現錯誤。
下面使用if...else if...else語句來實現網絡上非常流行的隔段問候語效果。要實現的效果為先判斷當前的時間,然后根據當前的時間來作出判斷。
完成后的代碼如下所示:
//獲取當前時間 var date:Date=new Date(); //獲取當前的小時 var hh:int=date.getHours(); //進行判斷 if (( hh >= 0 ) && (hh <= 4 )) { trace("深夜了,注意身體,該休息了!"); } else if (( hh >= 4 ) && (hh < 7)) { trace("清晨好,這么早就上網呀?! "); } else if (( hh >= 7 ) && (hh < 12)) { trace("早上好,一日之際在于晨,又是美好的一天!"); } else if (( hh >= 12) && (hh <= 13)) { trace("該吃午飯啦!有什么好吃的?"); } else if (( hh >= 13) && (hh <= 17)) { trace("外面的天氣很熱吧?!心靜自然涼! "); } else if (( hh >= 17) && (hh <= 18)) { trace("太陽落山了!快看看夕陽吧!"); } else if ((hh >= 18) && (hh <= 19)) { trace("吃過晚飯了嗎?"); } else if ((hh >= 19) && (hh <= 23)) { trace("一天過得可真快!今天過得好嗎?"); }
說明 if...else語句實現條件判斷,但是使用起來相對比較煩瑣一點,需要在使用的過程中根據需要來選擇。
3.3.3 switch語句
switch語句相當于一系列的if...else if...else語句,但是比if語句要清晰得多。switch語句不是對條件進行測試以獲得布爾值,而是對表達式進行求值,并使用計算結果確定要執行的代碼塊。
switch語句格式如下:
switch (表達式) { case1: 程序語句1; break; case2: 程序語句2; break; case3: 程序語句3; break; default: 默認執行程序語句; }
格式說明如下:
?表達式:可以是任何表達式,其結果是一個具體的值。
?case:關鍵字,其后跟有一個表達式、冒號和一組語句。如果在使用全等(===)的情況下,若此處的表達式與switch的表達式的參數相匹配,則執行這組語句。
?break:跳出判斷語句,也就是說,如果上面的表達式判斷正確,已經執行了相應的語句,那么執行以后將跳出判斷。
?default:關鍵字,其后跟有一組語句。如果case表達式都不與switch的表達式參數全等(===)匹配時,將執行這些語句。
下面使用switch語句結合Date.getDay()方法返回的日期值輸出當前的星期日期,代碼如下所示:
//獲取當前時間 var date:Date = new Date(); //獲取當前是星期幾 var dd:uint = date.getDay(); switch (dd) { case 0: trace("今天星期日"); break; case 1: trace("今天星期一"); break; case 2: trace("今天星期二"); break; case 3: trace("今天星期三"); break; case 4: trace("今天星期四"); break; case 5: trace("今天星期五"); break; case 6: trace("今天星期六"); break; default: trace("超出星期范圍,是不可能的!"); break; }
說明 break關鍵字是跳出執行語句,在遇到該關鍵字后,程序代碼將不再執行。
3.4 循環程序結構
在現實生活中有很多規律性的操作,作為程序來說就是要重復執行某些代碼。其中重復執行的代碼稱為循環體,能否重復操作,取決于循環的控制條件。循環語句可以認為是由循環體和控制條件兩部分組成。
循環程序的結構一般有兩種:
?一種是先進行條件判斷,若條件成立,執行循環體代碼,執行完成之后再進行條件判斷,若條件成立,循環繼續,否則退出循環。若第一次條件就不滿足,則一次也不執行,直接退出。
?另一種是先執行操作,不管條件,執行完成之后進行條件判斷,若條件成立,循環繼續,否則退出循環。
下面依次介紹ActionScript 3.0中的循環語句:for循環語句、while循環語句、do...while循環語句、for...in循環語句和for each...in循環語句。
3.4.1 for循環語句
for循環語句是ActionScript編程語言中最靈活、應用最為廣泛的語句。for循環語句語法格式如下:
for(初始化;循環條件;步進語句) { 循環執行的語句; }
格式說明如下:
?初始化:把程序循環體中需要使用的變量進行初始化。注意要使用var關鍵字來定義變量,否則編譯時會報錯。
?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為false,退出循環,否則繼續執行循環代碼。
?步進語句:算術表達式,用于改變循環變量的值。通常為使用++(遞增)或--(遞減)運算符的賦值表達式。
?循環執行的語句:循環體,通過不斷改變變量的值,以達到需要實現的目標。
下面的這段代碼可以用來計算1~100的自然數之和:
//初始化變量 var sum = 0; //下面是 for 循環 for (var i:int=1; i<=100; i++) { //在計算加和的基礎上累加 sum = sum + i;//循環體 } trace("sum="+sum);
代碼運行后的輸出結果如下所示:
//輸出結果:sum=5050
另外,利用逗號運算符(,)可以在for循環中增加變量和控制語句。語法格式如下所示:
for(初始化語句1,初始化語句2;循環條件;步進語句1,步進語句2)
下面計算兩個變量之積小于100的值,并輸出對應的計算表達式。代碼如下所示:
for (var a:int=1,b:int=20; a*b<100; a++,b--) { trace(a+"*"+b+"="+a*b); }
代碼運行后的輸出結果如下所示:
1*20=20 2*19=38 3*18=54 4*17=68 5*16=80 6*15=90 7*14=98
注意 在多個初始化語句中,只能在第一個初始化語句中使用var關鍵字,其他的語句不能使用var關鍵字,否則編譯器會報錯。
3.4.2 while循環語句
while循環語句是典型的“當型循環”語句,意思是當滿足條件時,執行循環體的內容。while循環語句語法格式如下:
while(循環條件) { 循環執行的語句 }
格式說明如下:
?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為true,繼續執行循環代碼,否則退出循環。
?循環執行的語句:循環體,其中包括變量改變賦值表達式,以及執行語句并實現變量賦值。
該語句是常用的循環語句,其代碼的執行過程為:先測試循環條件的邏輯結果,如果返回true,則運行循環語句塊,如果該條件為false,則跳過該語句塊,并執行while動作語句塊之后的第一條語句。下面使用while循環計算1~100的自然數之和。代碼如下所示:
//先初始化變量 var i:int = 0; var sum:int=0; //下面是 while 循環 while (i <= 100) { sum = sum + i; i++; } trace("sum="+sum);
代碼運行后的輸出結果如下所示:
sum=5050
3.4.3 do...while循環語句
do...while循環是另一種while循環,它保證至少執行一次循環代碼,這是因為其在執行代碼塊后才會檢查循環條件。do...while循環語句語法格式如下:
do {
循環執行的語句
} while (循環條件)
格式說明如下:
?循環執行的語句:循環體,其中包括變量改變賦值表達式,以及執行語句并實現變量賦值。
?循環條件:邏輯運算表達式,運算的結果決定循環的進程,若為true,繼續執行循環代碼,否則退出循環。
該語句的執行順序和while語句有一定的區別。該循環要先執行語句,然后進入循環條件判斷,如果條件為true,繼續進行循環,否則跳出循環。
下面使用do...while循環計算1~100的自然數之和。代碼如下所示:
//初始化變量 var i:int=0; var sum:int; //循環語句 do {; //循環體 sum+=i; i++; } while (i<=100); //輸出結果 trace("sum="+sum);
代碼運行后的輸出結果如下所示:
sum=5050
3.4.4 for...in和for each...in語句
for...in和for each...in語句都可以用于循環訪問對象屬性或數組元素。下面分別使用這兩個語句來訪問對象中的屬性。代碼如下所示:
//定義一個對象lzxt,并添加屬性name和age var lzxt:Object = {name:"浪子嘯天", age:30}; //執行遍歷操作 for (var i:String in lzxt) { //輸出屬性名稱和屬性值 trace("for in 語句輸出:"+i + ": " + lzxt[i]); } //執行for each遍歷操作 for each (var k:String in lzxt) { //輸出屬性值 trace("for each 語句輸出:"+k); }
代碼運行后的輸出結果如下所示:
for in 語句輸出:age: 30 for in 語句輸出:name: 浪子嘯天 for each 語句輸出:30 for each 語句輸出:浪子嘯天
說明
從上面語句的測試結果可以看出,for...in語句在執行遍歷對象操作時,遍歷的結果是對象的屬性;for each...in語句遍歷的結果是屬性的值。另外,for...in語句可以通過數組訪問符“[]”和遍歷出的對象屬性來訪問對象屬性的值。
下面分別使用兩種語句來遍歷數組中的值。代碼如下所示:
//定義一個數組變量,并初始化賦值 var arr:Array = ["one", "two", "three"]; //執行for in 遍歷操作 for (var i:String in arr) { //輸出數組的值 trace(arr[i]); } //執行for each in遍歷操作 for each (var k in arr) { trace(k); }
代碼運行后的輸出結果如下所示:
one two three one two three
從一些程序的測試結果來看,for each...in語句比for...in語句的執行速度要快,執行效率要高。
for each...in語句除了可以用來遍歷對象和數組的值,還可以通過循環訪問XML或XMLList對象。下面使用for each...in語句來訪問XML對象,代碼如下所示:
//聲明一個XML對象,并初始化賦值 var myXML:XML = <book> <bookname>flash cs3之路</bookname> <bookname>as3基礎教程</bookname> <bookname>flex語言基礎</bookname> </book>; //屬于for each...in操作遍歷XML對象 for each (var item in myXML.bookname) { //輸出遍歷獲得的結果 trace(item); }
代碼運行后的輸出結果如下所示:
flash cs3之路 as3基礎教程 flex語言基礎
使用for each...in語句可以很方便地訪問XML對象,并獲取節點屬性的值。
3.4.5 循環的嵌套
嵌套循環語句是在一個循環的循環體中存在另一個循環體,如此重復下去直到循環結束為止,即為循環中的循環。以for循環為例,格式如下所示:
for (初始化; 循環條件; 步進語句) { for (初始化; 循環條件; 步進語句) { 循環執行的語句; } }
下面使用循環語句,實現一個九九乘法表的效果。代碼如下所示:
//循環語句1 for (var i:int=1; i<10; i++) { //循環語句2 for (var j:int=1; j<=i; j++) { //循環體 var label:TextField=new TextField(); label.text=i+"×"+j+"="+i*j; label.x=5+50*i; label.y=20*j; addChild(label); } }
完成后的效果如圖3.4所示。

圖3.4 九九乘法表效果圖
循環嵌套可以解決很多比較麻煩的問題,但是也有一些需要注意的地方:
?使用嵌套循環時,內部循環體的變量不要和外部循環體的變量相同。
?嵌套循環結構的書寫,最好用嚴格格式,采用相應的縮進,以體現循環層次。
?要盡量避免使用太多層的循環結構,否則執行的效率會比較低。
3.4.6 循環流程控制語句
在ActionScript 3.0中可以使用break和continue來控制循環流程。break語句的結果是直接跳出循環,不再執行后面的語句;continue語句的結果是停止當前這一輪的循環,直接跳到下一輪的循環,而當前輪次中continue后面的語句也不再執行。
下面的兩個例子分別執行循環變量從0遞增到10的過程,如果i等于4,分別執行break和continue語句,觀察各自執行的情況。代碼如下所示:
//使用break控制循環 for (var i:int=0; i<10; i++) { if (i==3) { break; } trace("當前數字是:"+i); }
代碼運行后的輸出結果如下所示:
當前數字是:0 當前數字是:1 當前數字是:2
下面使用continue控制循環,代碼如下所示:
for (var j:int=0; j<10; j++) {
if (j==3) {
continue;
}
trace("當前數字是:"+j);
}
代碼運行后的輸出結果如下所示:
當前數字是:0 當前數字是:1 當前數字是:2 當前數字是:4 當前數字是:5 當前數字是:6 當前數字是:7 當前數字是:8 當前數字是:9
說明
從上面代碼的輸出結果來看,break語句直接退出了循環,只輸出到2,就連已經執行到的數值3都沒有輸出;continue語句則只是退出了當前輪次語句的執行,當重新開始后繼續執行循環,故至少輸出了i=3這一個結果。
break語句控制循環流程的退出。如果是在嵌套循環中,則主循環體內的break只能退出當前的循環,不能退出外部的循環。要使用break控制,則必須使用多個break語句。而ActionScript中引入了標簽,新的標簽可以和循環體一起使用,通過break標簽的方法直接退出循環。下面的示例從內循環直接退出主循環。代碼如下所示:
var j:Number; mainLoop:for (var i:int=0; i<10; i++) { for (j=0; j<10; j++) { if (i > 3 || j > 3) { break mainLoop; } trace(i,j); } }
代碼運行后的輸出結果如下所示:
0 0 0 1 0 2 0 3
說明
其中的mainLoop就是自定義的標簽,當表達式i > 3 || j > 3返回為false時,就退出循環。
3.5 練習題
1. 用for循環計算1,2,4,8,?,2n(n=10)的和。
2. for(var...in...)和for each(...in...)是我們常用的遍歷方法,它們有什么區別?
3. 補充下面代碼,輸出數據中的書名,輸出格式為:
book1:sky book2:the wind
代碼:
var arr:Array=[{name: "yyy",book: "sky"},{name: "xiang"},book: "the wind"] for(var i in arr){ var data:Object=arr[i]; for(var j in data){ trace( ) } }
4. 運行以下代碼,i的值會是( )。
for(var i=0;i<10;++i){ } i=i+++i++; trace(i);
A. 11
B. 12
C. 21
D. 22
- 黑客攻防從入門到精通(實戰秘笈版)
- 精通Nginx(第2版)
- PostgreSQL技術內幕:事務處理深度探索
- HTML5+CSS3網頁設計
- Python編程從0到1(視頻教學版)
- Serverless computing in Azure with .NET
- Practical Game Design with Unity and Playmaker
- Mastering Python Design Patterns
- HoloLens與混合現實開發
- Building Slack Bots
- 超簡單:Photoshop+JavaScript+Python智能修圖與圖像自動化處理
- 數字媒體技術概論
- Keil Cx51 V7.0單片機高級語言編程與μVision2應用實踐
- 游戲設計的底層邏輯
- Mastering ArcGIS Server Development with JavaScript