5. 變量值的類型
我們在ActionScript編程過程中所使用的數(shù)據(jù)有多種類型。迄今為止,我們已經(jīng)看到過數(shù)字型和文本型,而諸如布爾、數(shù)組、函數(shù),和對象等類型我們也將很快接觸到。在我們觸及每種數(shù)據(jù)類型的細(xì)節(jié)之前,先討論一些與變量的使用密切相關(guān)的數(shù)據(jù)類型問題。 1.自動定義類型 在ActionScript中,任何變量都可以包含任何類型的數(shù)據(jù)。這看起來不值得注意,但是,某個變量中可以包含任何類型的數(shù)據(jù)的能力實際上是很不尋常的。象C++和Java這樣嚴(yán)謹(jǐn)?shù)木幊陶Z言使用既定義類型的變量;也就是說每個變量只能接受一種既定類型的數(shù)據(jù),而此種類型必須在變量聲明時明確指定。ActionScript變量是自動定義類型的變量 —— 當(dāng)我們?yōu)槟硞變量賦值時,解釋器為我們設(shè)置該變量的數(shù)據(jù)類型。
ActionScript變量不僅能包含任何數(shù)據(jù)類型,而且它們可以動態(tài)地改變數(shù)據(jù)類型。如果我們?yōu)槟硞變量賦一個新值,而該值與該變量原有值的類型不同,則該變量自動地被重新定義類型。綜上所述,下面的代碼在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這樣的編程語言中,自動地重新定義類型是不被支持的,類型不匹配的數(shù)據(jù)將被轉(zhuǎn)換為變量現(xiàn)有的數(shù)據(jù)類型(或者會導(dǎo)致錯誤的發(fā)生 —— 如果該轉(zhuǎn)換無法完成),而轉(zhuǎn)換后的數(shù)據(jù)我們認(rèn)為是不確定的(無法控制的)。在接下來的部分中我們將考慮自動定義類型和動態(tài)轉(zhuǎn)換類型的一些重要概念。
2.自動的值轉(zhuǎn)換 在某些環(huán)境中,ActionScript期待某種特定類型的數(shù)據(jù)。如果我們使用某個變量而該變量的數(shù)據(jù)值與期待的類型并不匹配,那么解釋器會嘗試轉(zhuǎn)換該數(shù)據(jù)。例如,我們在需要數(shù)字的地方使用文本變量,為了適應(yīng)當(dāng)前的作業(yè),解釋器將試圖轉(zhuǎn)換該變量的文本值為某個數(shù)字值。在下面的例子中,z被設(shè)置為2。為什么?因為減號運(yùn)算符(或稱操作符,這兩種說法并無明顯區(qū)別,我將根據(jù)上下文關(guān)系來決定使用恰當(dāng)?shù)姆Q呼)期待的是一個數(shù)字,所以變量y的值從字符串“4”轉(zhuǎn)變?yōu)閿?shù)字4,然后被6(x的值)減,產(chǎn)生結(jié)果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
相反地,如果在某個期待字符串的地方我們使用數(shù)字變量,解釋器則嘗試將該數(shù)字轉(zhuǎn)換為一個串。在下例中,z被設(shè)置為串“64”,而非數(shù)字10。這又是為什么呢?因為表達(dá)式x + y中的第二個操作數(shù)是個串,因此,加號運(yùn)算符完成的是串連接而不是算術(shù)運(yùn)算中的加法。x的值(數(shù)字6)被轉(zhuǎn)變?yōu)榇?”,然后與串“4”(y的值)相連接,產(chǎn)生結(jié)果“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"
自動的類型轉(zhuǎn)換發(fā)生在對作為表達(dá)式的組成部分的某個變量求值的時侯,轉(zhuǎn)換的對象是該變量中所含數(shù)據(jù)的一個副本 —— 并不影響原始的變量類型。某個變量的類型只有在該變量被賦予某個與其現(xiàn)有值的類型不匹配的數(shù)據(jù)值時才發(fā)生根本轉(zhuǎn)變。不好,不好,這太繁瑣太復(fù)雜了,我寫起來困難,你看著更是一頭霧水,我們把這幾句話打散,力求簡潔明了。從上述兩個例子開始:x + y和x - y是兩個表達(dá)式,而變量x和y分別是表達(dá)式的組成部分,在語句z = x + y;和z = x - y;中,為了得到變量z的值,我們必須先對x和y求值,但是,在這兩個語句中,變量x和變量y的類型分別是數(shù)字型和字符串型,也就是說兩個操作數(shù)的數(shù)據(jù)類型不一致(不匹配),因此,就發(fā)生了自動的類型轉(zhuǎn)換(解釋器根據(jù)上下文環(huán)境決定變量所包含數(shù)據(jù)的類型),重要的是,你必須記住:此時被轉(zhuǎn)換了類型的數(shù)據(jù)并不是變量所包含的原始數(shù)據(jù),而是該原始數(shù)據(jù)的一個副本;換句話說,變量的類型并未改變,改變的只是變量中所包含的數(shù)據(jù)的一個副本的類型。既然如此,我們應(yīng)該更進(jìn)一步,了解變量的類型何時發(fā)生轉(zhuǎn)變;舉例說明,在賦值語句:x = 6;中,變量x此時的類型是數(shù)字型(一目了然),如果我們隨后再次為變量x賦值:x = "abc";,現(xiàn)在,x的類型不再是數(shù)字型,而是字符串型(我們有時也稱其為文本串型)?偨Y(jié)一下,變量x的原類型為數(shù)字型,再次賦值后變?yōu)樽址,這是因為變量x最后被賦予的值("abc")的類型與此前變量所包含的值(6)的類型不一致,因此,出現(xiàn)了動態(tài)轉(zhuǎn)換變量類型的情況,變量的類型發(fā)生了根本地轉(zhuǎn)變。再回到上面兩個例子中,因為并未對變量x和y重新賦值(賦不同類型的值),所以y最終仍保持為字符串型,而x也保持為數(shù)字型。
我想你一定注意到在上述兩個例子中操作符的不同表現(xiàn),z = x + y;和z = x - y;中的兩個操作符(加號“+”和減號“-”)對這兩個賦值語句有著意義深遠(yuǎn)的影響。在z = x - y;中,y的串值“4”轉(zhuǎn)換成為數(shù)字值4;而在z = x + y;中,發(fā)生了相反的情況,x的數(shù)字值6變成串值“6”。這是因為對于操作符“+”和操作符“-”來說,存在著迥然而異的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則。我們將在以后的章節(jié)中詳細(xì)討論數(shù)據(jù)類型轉(zhuǎn)換規(guī)則以及操作符。
3.手工確定類型 自動的數(shù)據(jù)類型定義和轉(zhuǎn)換會帶來便利,但是,正如上述例子中所描述的那樣,可能會產(chǎn)生意外的結(jié)果。對不同類型的數(shù)據(jù)或變量進(jìn)行操作的命令在開始執(zhí)行之前,你或許想要首先確定某個變量的數(shù)據(jù)類型;此時可以使用typeof操作符: productName = "Macromedia Flash"; // string value trace (typeof productName); // displays: "string" on the Output window when you run the script
一旦我們知道了某個變量的類型,我們可以有選擇地進(jìn)行下一步處理。例如,在運(yùn)行某段代碼之前我們先檢查該代碼段中的某個變量是否是數(shù)字型: if (typeof age == "number") { // okay to carry on } else { trace ("age isn't a number"); // display an error message }
關(guān)于typeof操作符的所有細(xì)節(jié)我們將在以后專門討論。
出處:藍(lán)色理想
責(zé)任編輯:無意
上一頁 變量(4)- 變量值的改變和取回 下一頁 變量(6)- 變量的作用域
◎進(jìn)入論壇Flash專欄版塊參加討論
|