第四節(jié) 數(shù)據(jù)類型轉(zhuǎn)換 更進(jìn)一步地觀察來自前一個部分的例子。該例中,每個數(shù)據(jù) —— "1"和2 —— 都屬于它們各自的數(shù)據(jù)類型;第一個數(shù)據(jù)是字符串而第二個則是數(shù)字。我們看到解釋器將兩個值連接在一起形成字符串"12"。注意,解釋器首先必須將數(shù)字2轉(zhuǎn)換為字符串"2",只有該自動轉(zhuǎn)換完成之后,值"2"(串)才能被連接到串"1"上。
數(shù)據(jù)類型轉(zhuǎn)換只是意味著某個數(shù)據(jù)的類型的改變。并非所有的數(shù)據(jù)類型轉(zhuǎn)換都是自動的;當(dāng)然,如果我們不外在地改變某個數(shù)據(jù)的類型,ActionScript會默認(rèn)執(zhí)行數(shù)據(jù)類型定義;相反,如果我們希望屏蔽ActionScript自動定義數(shù)據(jù)類型這一行為,我們則可以外在地、明確地改變數(shù)據(jù)的類型。
1.自動的類型轉(zhuǎn)換 只要我們在某個語境中使用一個數(shù)據(jù)類型不匹配的值,解釋器就試圖轉(zhuǎn)換。也就是說,如果解釋器期待類型A的數(shù)據(jù),而我們卻提供了類型B的數(shù)據(jù),解釋器將嘗試將類型B的數(shù)據(jù)轉(zhuǎn)換為類型A的數(shù)據(jù)。例如,在下列代碼中我們使用字符串"Flash"作為減號操作符右邊的操作數(shù)。因為只有數(shù)字才可以被用于減號操作符,所以解釋器試圖將字符串"Flash"轉(zhuǎn)換為一個數(shù)字: 999 - "Flash";
當(dāng)然,串"Flash"無法成功地被轉(zhuǎn)換成任何合法的數(shù)字,因此它被轉(zhuǎn)換為特殊的數(shù)字?jǐn)?shù)據(jù)值NaN(即,Not-a-Number)。NaN是數(shù)字?jǐn)?shù)據(jù)類型的一個合法值,明確地被指定用于處理上述的情況。由于"Flash"被轉(zhuǎn)換為NaN,我們的表達(dá)式對解釋器來說最終看起來象這樣(盡管我們永遠(yuǎn)不可能看到這一內(nèi)部步驟): 999 - NaN;
現(xiàn)在,減號操作符兩邊的操作數(shù)都是數(shù)字,因此該操作可以繼續(xù)下去:999 - NaN產(chǎn)生了值NaN,這就是我們的表達(dá)式的最終值。
產(chǎn)生數(shù)字值NaN的表達(dá)式并無特殊用途;大多數(shù)轉(zhuǎn)換能產(chǎn)生更具功能性的結(jié)果,例如,如果某個字符串只包含數(shù)字字符,那么它可以被轉(zhuǎn)換為一個有用的數(shù)字。表達(dá)式: 999 - "9"; // the number 999 minus the string "9"
在解釋器內(nèi)部轉(zhuǎn)換為: 999 - 9; // the number 999 minus the number 9
當(dāng)表達(dá)式被求解時它產(chǎn)生了值990。自動的轉(zhuǎn)換最常見于加號操作符、比較操作符,以及條件和與循環(huán)語句(Alvin注:比較操作符包括等于、不等于、大于和小于,等等)。為了確定包含自動轉(zhuǎn)換的任何表達(dá)式的計算結(jié)果,我們必須回答三個問題:(1)在當(dāng)前的上下文關(guān)系(語境)中,所期待的數(shù)據(jù)類型是什么?(2)在該上下文關(guān)系中,如果提供一個并不是被期待的數(shù)據(jù)類型,會發(fā)生什么?而且(3)當(dāng)轉(zhuǎn)換發(fā)生時,因此而產(chǎn)生的值是什么?
要回答頭兩個問題,我們需要參閱一些適當(dāng)?shù)闹黝},這些主題可在本書的其他章節(jié)中找到(例如,為了確定在一個條件語句中哪種數(shù)據(jù)類型被期待出現(xiàn),可以參考有關(guān)條件語句的章節(jié))。
下面的三個列表列出了自動轉(zhuǎn)換的規(guī)則,它們回答了第三個問題,“當(dāng)轉(zhuǎn)換發(fā)生時,因此而產(chǎn)生的值是什么?”。
表一顯示了每種數(shù)據(jù)類型轉(zhuǎn)換成數(shù)字后的結(jié)果。
表一 轉(zhuǎn)換為數(shù)字 原始數(shù)據(jù) 轉(zhuǎn)換后的結(jié)果 —————————————— undefined 0 null 0 布爾值 1(如果原始值為true)或0(如果原始值為false) 數(shù)字字符串 如果字符串僅由十進(jìn)制數(shù)字、指數(shù)、小數(shù)點、加號、減號或空白組成(例如,"-1.23e4"),那么轉(zhuǎn)換后的結(jié)果即是該字符串所描述的數(shù)字值。(Alvin注:有關(guān)空白(空格、制表符);空白所在位置很微妙,如果僅在字符串的開端有空白,并不影響字符串轉(zhuǎn)換為我們期待的數(shù)字;例如,字符串" 123.456"將轉(zhuǎn)換成數(shù)字123.456。如果空白在字符串的中央("123.4 56")或在字符串的末尾("123.456 ")則會產(chǎn)生一個NaN。同樣地,減號、加號也是如此,你可以嘗試將它們放在字符串的不同位置,觀察產(chǎn)生的結(jié)果。有關(guān)指數(shù),e;當(dāng)其在字符串開端的時候,會產(chǎn)生一個NaN,而在字符串中間時,我們都知道,這是正常的,恕不贅述;那么,當(dāng)其在字符串末尾時,比如,"123e",又會怎樣呢?回答:在轉(zhuǎn)換過程中,解釋器認(rèn)為指數(shù)是零,即123e0,結(jié)果當(dāng)然是123本身了。有關(guān)小數(shù)點;如果小數(shù)點在字符串的開端,那么解釋器默認(rèn)該字符串為純小數(shù),例如,".123"在轉(zhuǎn)換后變成0.123;如果在中央,伙計,這還用我說嗎?如果在末尾,解釋器認(rèn)為該字符串轉(zhuǎn)換成數(shù)字后的小數(shù)位是零,即沒有小數(shù)位;如,"123."轉(zhuǎn)換后的結(jié)果是數(shù)字123。) 其他字符串 空字符串、非數(shù)字字符串,包括由"x","0x",或"FF"為開頭的字符串,都轉(zhuǎn)換為NaN "Infinity" Infinity "-Infinity" -Infinity "NaN" NaN 數(shù)組 NaN 對象 該對象的valueOf ()方法的返回值。 電影剪輯 NaN
表二顯示了每種數(shù)據(jù)類型轉(zhuǎn)換成字符串后的結(jié)果
表二 轉(zhuǎn)換為字符串 原始數(shù)據(jù) 轉(zhuǎn)換后的結(jié)果 —————————————— undefined ""(空字符串) null "null" 布爾值 "true"(如果原始值為true)或"false(如果原始值為false) NaN "NaN" 0 "0" Infinity "Infinity" -Infinity "-Infinity" 其他數(shù)字值 字符串與該值的字面一樣。例如,987.321變成"987.321"。 數(shù)組 由逗號分隔的元素值列表 對象 對該對象調(diào)用toString ()方法而產(chǎn)生的結(jié)果。缺省情況下,某個對象的toString ()方法會返回"[object Object]"。當(dāng)然,toString ()方法也能夠被定制為返回一個更有用的結(jié)果(例如,一個Date對象的toString ()可以返回:"Sun Jan 12 11:33:18 EDT 2003") 電影剪輯 該電影剪輯實例的路徑。始于播放器中該電影剪輯所在的電影文檔層,是絕對路徑;例如,"_level0.ball"
表三顯示了每種數(shù)據(jù)類型轉(zhuǎn)換成布爾值后的結(jié)果
表三 轉(zhuǎn)換為布爾值 原始數(shù)據(jù) 轉(zhuǎn)換后的結(jié)果 —————————————— undefined false null false NaN false 0 false Infinity true -Infinity true 其他數(shù)字值 true 非空字符串 如果該字符串能被轉(zhuǎn)換成一個有效的非零數(shù)字,則為true,否則,為false。在ECMA-262標(biāo)準(zhǔn)中,一個非空字符串總是能被轉(zhuǎn)換為true(為了與Flash 4版本保持兼容,F(xiàn)lash 5和Flash MX版本突破了該規(guī)則) 空字符串("") false 數(shù)組 true 對象 true 電影剪輯 true
to be continue... alvin
出處:藍(lán)色理想
責(zé)任編輯:無意
上一頁 數(shù)據(jù)和數(shù)據(jù)類型(3) - 創(chuàng)建并分類數(shù)據(jù) 下一頁
◎進(jìn)入論壇Flash專欄版塊參加討論
|