WML?Script語(yǔ)法基礎(chǔ)
WML?Script是屬于無(wú)限應(yīng)用協(xié)議WAP應(yīng)用層的一部分,使用它可以向WML卡片組和卡片中添加客戶端的處理邏輯,目前最新的版本是1.1版。WML?Script1.1是在歐洲計(jì)算機(jī)制造商協(xié)議會(huì)制定的ECMAScript腳本語(yǔ)言的基礎(chǔ)上,經(jīng)過(guò)修改和優(yōu)化而指定的。它能夠更好的支持諸如移動(dòng)電話類的乍帶寬通信設(shè)備,在WML編程中使用WML?Script可以有效的增強(qiáng)客戶端應(yīng)用的靈活性,而且,我們也可以把WML?Script作為一個(gè)工具使用,開(kāi)發(fā)出功能強(qiáng)大的WAP網(wǎng)絡(luò)應(yīng)用和無(wú)限網(wǎng)頁(yè)。本章我們將詳細(xì)講解WML?Script1.1編程的基礎(chǔ)預(yù)法制時(shí),如基本規(guī)則、變量預(yù)數(shù)據(jù)類型、操作賦予表達(dá)式等。為了敘述上的簡(jiǎn)便,以后我們將“WML?Script1.1”簡(jiǎn)稱“WMLScript?薄?
4.1?WML?程序中調(diào)用WML?Script函數(shù)
經(jīng)過(guò)前兩章的學(xué)習(xí),熟悉C語(yǔ)言的讀者可能會(huì)認(rèn)識(shí)到,WML?的函數(shù)功能、邏輯運(yùn)算功能等都是十分有限的。而WMLScript提供了豐富的函數(shù)功能,我們?cè)赪AP應(yīng)用開(kāi)發(fā)可以使用WMLScript來(lái)增強(qiáng)WML編程。因此,WMLScript成為擴(kuò)展WML編程能力的主要開(kāi)發(fā)工具。
4.2?WMLScript的主要優(yōu)點(diǎn)及其字節(jié)碼解釋器
WMLScript具有一套定義好的字節(jié)碼和一個(gè)解釋器參考結(jié)構(gòu)。無(wú)線網(wǎng)絡(luò)傳輸中WMLScript的數(shù)據(jù)均以二進(jìn)制格式進(jìn)行傳輸,所以,用戶可以使用乍帶寬通信信道,從而能夠保持客戶端手機(jī)只需要最小限度的內(nèi)存。ECMAScript修改后得到的WMLScript能夠更快、更小、更容易的編譯程序?yàn)樽止?jié)碼形式。所有這些特點(diǎn),是WMLScript具備了WML所不能具備的很多優(yōu)點(diǎn)和功能。
4.2.1?使用WMLScript的主要優(yōu)點(diǎn)
WMLScript的設(shè)計(jì)宗旨是為WMLScript系統(tǒng)提供一般的腳本處理能力,使用WMLScript我們可以進(jìn)一步補(bǔ)充基于XML的WML語(yǔ)言的編程功能,開(kāi)發(fā)針對(duì)乍帶寬的網(wǎng)絡(luò)應(yīng)用及內(nèi)容,如文本、圖像、選擇列表等,我們可以使用簡(jiǎn)單的格式編寫(xiě)出更靈活和更具可讀性的用戶界面。WMLScript具備的WML所不能具備的優(yōu)點(diǎn)和功能,主要包括如下幾個(gè)方面:?(1)檢查用戶輸入的合法性:
(2)擴(kuò)展用戶瀏覽器的功能,比如允許程序員開(kāi)發(fā)手機(jī)的電話呼叫、發(fā)送短信息、存儲(chǔ)電話號(hào)碼、管理電話簿或SIM卡等;
(3)生成用戶端的確認(rèn)、提示、警告信息或操作對(duì)話框,并使之快速顯示在瀏覽器上;
(4)在用戶瀏覽器的更改后,能夠?qū)g覽器端的軟件和參數(shù)進(jìn)行擴(kuò)展與配置;
(5)最大程度克服客戶端的乍帶寬通信連接限制,并提供豐富的程序功能;
(6)補(bǔ)充WML并使之實(shí)現(xiàn)針對(duì)微型移動(dòng)終端設(shè)備的多種服務(wù),如支持高級(jí)用戶界面、增加客戶端智能型、提供用戶瀏覽器外圍功能的訪問(wèn)能力,以及在服務(wù)器與客戶端瀏覽傳輸數(shù)據(jù)是減少帶寬占用等。
4.2.2?WMLScript的字節(jié)碼解釋器
在WMLScript的字節(jié)碼解釋器解釋之前,WMLScript語(yǔ)言編寫(xiě)的文本格式的程序?qū)⒈皇紫染幾g為二進(jìn)制格式的代碼。編譯時(shí),編譯器通常先將WMLScript程序分成若干個(gè)編輯單位,每個(gè)單位的程序都包含一定數(shù)量的語(yǔ)句行和WMLScript函數(shù),然后,WMLScript的編譯器將按照這些編譯單位,逐一將WMLScript程序作為輸入內(nèi)容,而把對(duì)應(yīng)的字節(jié)碼作為輸出內(nèi)容。當(dāng)用戶通過(guò)WAP手機(jī)調(diào)用WMLScript程序時(shí),編譯器的編碼功能即被激活、執(zhí)行。
4.3?WMLScript基本規(guī)則
WMLScript在許多基本規(guī)則方面沿用了WML的做法。不過(guò),由于WMLScript是以C語(yǔ)言為藍(lán)本而指定的,所以它的語(yǔ)法特征和C語(yǔ)言非常相像。如果大家對(duì)C語(yǔ)言比較熟悉,那么學(xué)習(xí)和掌握這部分內(nèi)容應(yīng)當(dāng)是比較容易的。
4.3.1?WMLScript與URL
與WML一樣,WMLScript也沿用了WWW和HTML訪問(wèn)資源的URL、HTTP等規(guī)范,并擴(kuò)大了URL使用的范圍。在WMLScript中,不僅超鏈接、文件路徑即文件名可以作為URL處理,外部函數(shù)、訪問(wèn)控制信息等也可以作為URL處理。
為此,WMLScript采用了WML的變通方法,即改進(jìn)HTML命名資源為值的方式,采用程序段錨點(diǎn)(Fragment?Anchor)的形式來(lái)處理資源定位。程序段錨點(diǎn)根據(jù)文檔URL規(guī)則進(jìn)行定義,并按照程序段標(biāo)識(shí)符前加井字號(hào)(#)的方式書(shū)寫(xiě)。使用程序段錨點(diǎn),WMLScript程序可以在WMLScript編譯單位內(nèi)可任意指定的函數(shù),并可在調(diào)用該函數(shù)的同時(shí)傳遞所需的參數(shù)。
4.3.2?詞法結(jié)構(gòu)
WMLScript編程中的詞法結(jié)構(gòu)并不復(fù)雜,我們下面就從大小寫(xiě)敏感、空格、換行、注釋即保留字等方面講解相關(guān)的具體規(guī)則。
(1)內(nèi)容類型。WMLScript的內(nèi)容類型主要針對(duì)文件形式和二進(jìn)制形式兩種情況,類型結(jié)構(gòu)可以在服務(wù)器端進(jìn)行指定,具體形式為:
文本形式:text/vnd.wap.wmlscript;
二進(jìn)制形式:application/vnd.wap.wmlscriptc。
具體指定方法我們?cè)诘?章已經(jīng)介紹過(guò),這里不再重述。
(2)大小寫(xiě)敏感。WMLScript1.1是一種大小寫(xiě)敏感的腳本語(yǔ)言。它所設(shè)計(jì)的各種關(guān)鍵字、變量和函數(shù)名都必須合理的使用大小寫(xiě)。
(3)空格和換行。一般情況下,WMLScript程序值形式將忽略所有的空格、制表符合換行符等。但如果把這些特殊字符通過(guò)代碼進(jìn)行表述,或者作為字符串進(jìn)行處理時(shí),WMLScript將不再忽略它們。了如,字符串\"Oct?28,2001\"中含有空格,該空格在執(zhí)行時(shí)就不會(huì)被忽略,它與不含空格的字符串\"Oct28,2001\"是不同的。
(4)注釋。與WML編程一樣,在WMLScript腳本程序中也可以加入注釋內(nèi)容。注釋內(nèi)容不被程序執(zhí)行,且注釋不能嵌套。WMLScript的注釋方法有兩種:
其一,行注釋。即使用雙斜行號(hào)(//)引導(dǎo)以一行內(nèi)容,這一行內(nèi)容全部作為注釋內(nèi)容。如:
//這是以行注釋,由雙斜杠號(hào)開(kāi)始到結(jié)束都是注釋。
其二,塊選擇。即以符號(hào)“/*”開(kāi)始,而以符號(hào)“/*”結(jié)束的期間所有內(nèi)容都是注釋內(nèi)容。如:
/*這就是塊注釋,加在中間的內(nèi)容就是注釋內(nèi)容*/
(5)數(shù)據(jù)類型與直接編碼。WMLScript允許將4種類型的數(shù)據(jù)直接編碼并可嵌套并可嵌如在程序之中。直接編碼的4中數(shù)據(jù)類型為:整數(shù)、浮點(diǎn)數(shù)、字符串和布爾值。另外,“無(wú)效性”值也可直接編碼”?1.?整數(shù)。當(dāng)以十進(jìn)制、十六進(jìn)制或八進(jìn)制方式使用整數(shù)時(shí),可對(duì)這類整數(shù)進(jìn)行直接編碼。
編程序時(shí),十進(jìn)制的數(shù)字均不以0開(kāi)頭,只包含0~9的數(shù)值串;十六進(jìn)制的數(shù)據(jù)以O(shè)X或者Ox開(kāi)頭,只包含0~9、a~f或者A~F的字符串;八進(jìn)制的數(shù)均以0開(kāi)頭,只包含0~7的數(shù)字串。
2.浮點(diǎn)數(shù)。浮點(diǎn)數(shù)通常定義為含有小數(shù)點(diǎn)的數(shù)字,可以包含小數(shù)和指數(shù)部分。浮點(diǎn)數(shù)的形式較多,可以使十進(jìn)制的整數(shù)或浮點(diǎn)數(shù),可以是分?jǐn)?shù),也可以是指數(shù);但一個(gè)浮點(diǎn)數(shù)必須至少有一個(gè)數(shù)。
指數(shù)是以e或E開(kāi)頭,后面跟著一個(gè)整數(shù)。指數(shù)是以10為底冪。例如:e0時(shí)10的零次冪,例如:e0時(shí)10的另次冪,e-2時(shí)10的負(fù)2次冪集等于0.01。指數(shù)可以帶符號(hào),正好(+)或者減號(hào)(-),它們分別代表是正指數(shù)和負(fù)指數(shù)。
3.字符串。字符串是指定義在成對(duì)的雙引號(hào)(\"\")或單引號(hào)(‘?’)之間的內(nèi)容。
由于WMLScript只允許使用成對(duì)的雙引號(hào)或但引號(hào)來(lái)定義字符串,所以程序中使用一個(gè)單引號(hào)或一個(gè)雙引號(hào)時(shí)就會(huì)出現(xiàn)編譯錯(cuò)誤。
考慮到有些特殊字符不能在字符串中直接顯現(xiàn)出來(lái),所以WMLScript提供了轉(zhuǎn)譯序列來(lái)表示這些特殊字符。
4.布爾型。它只是ture和false兩個(gè)數(shù)值,用于表示W(wǎng)MLScript中的“真值”或“假值”。布爾型數(shù)據(jù)可參與異、或等運(yùn)算,具體規(guī)則我們后面介紹。
5.無(wú)效型。也稱為“空類型”,它是WMLScript支持的一個(gè)表示無(wú)效值的量,以invalid表示。該兩與C語(yǔ)言中的NULL類似。
4.保留字。WMLScript中定義有一個(gè)保留字集合,含有一些表示特殊意義的單詞這些次不能另外定義,也不能最為其他標(biāo)識(shí)符。WMLScript中的保留字如下:
acces?http?agent?if?break?isvalid?continue?meta?header
div?name?div=?path?domain?return?else?typeof?while
equiv?url?extern?use?for?user?function?var
另外,WMLScript還為將來(lái)的版本預(yù)留了一些保留字,主要有:
case?finally?catch?import?class?private?const?public?debugger
sizeof?default?struct?do?super?enum?switch?export?throw
extends?try
WMLScript還有一些沒(méi)有使用的保留字:
delete?null?in?this?lib?void?new?with
7.標(biāo)識(shí)符。WMLScript的標(biāo)識(shí)符可以指定或命名3種元素:變量、函數(shù)和標(biāo)注。標(biāo)識(shí)符不能以數(shù)字開(kāi)頭,但能一段下劃線(-)開(kāi)頭,而且,標(biāo)識(shí)符不能是WMLScript的保留字。例如,timeOfDay、speed?、quality、HOME_ADDRESS、_myName、__、varO等都是合法的標(biāo)識(shí)符;而以數(shù)字或非短下劃線的特殊符號(hào)開(kāi)頭的字串,以及保留字等都屬于不合法的標(biāo)志賦,如while、for、if、my~name、$sys、123、3piecs、take.this等。
由于WMLScript是嚴(yán)格區(qū)分大小寫(xiě)的,所以字母相同但大小寫(xiě)不同的標(biāo)識(shí)符不是同一個(gè)標(biāo)識(shí),例如,Work和work就是不同的標(biāo)識(shí)符。
8.名稱空間。WMLScript提供了比較自由的名稱空間,同一標(biāo)識(shí)符可以同時(shí)用作不同的目的。例如,作為某一函數(shù)名稱的標(biāo)識(shí)符,還可以同時(shí)用作變量名、函數(shù)參數(shù)、程序標(biāo)注等,使用時(shí)他們的屬性或值等并不相互影響。在下面的簡(jiǎn)單的例程中,myTest這一標(biāo)識(shí)符即用作了函數(shù)名,又用作了變量名、函數(shù)參數(shù)名、函數(shù)參數(shù)名、常量名。顯然,WMLScript的這一特定為我們編寫(xiě)程序提供了很大的方便。
4.3.3?WMLScript程序的基本書(shū)寫(xiě)規(guī)則
WMLScript程序的基本書(shū)本寫(xiě)規(guī)則:
1.程序由若干語(yǔ)句或函數(shù)組成,函數(shù)有由若干語(yǔ)句組成;
2.每個(gè)完整的語(yǔ)句后面必須加上分號(hào)(;),語(yǔ)句關(guān)鍵詞語(yǔ)操作數(shù)之間必須有空間;分號(hào)(;)是WMLScript程序的組成部分;
3.函數(shù)體之間必須使用成對(duì)的花括號(hào)({?})括起來(lái),而且函數(shù)結(jié)束時(shí)在右花括號(hào)(})的后面還要加上分號(hào)(;);函數(shù)說(shuō)明部分,如函數(shù)名、函數(shù)類型、函數(shù)參數(shù)等要放在花括號(hào)({})的前面;
4.有些語(yǔ)句可能也需要實(shí)用花括號(hào)({?})辦含內(nèi)容,這類語(yǔ)句通常也可以放在函數(shù)中,所以花括號(hào)({?})是可以嵌套的。
當(dāng)然,不同的語(yǔ)句、參數(shù)、變量等元素在聲明和書(shū)寫(xiě)時(shí)可能還有一些更細(xì)的要求,具體我們后面介紹這些元素是再專門(mén)給出,
4.4?變量與數(shù)據(jù)類型
變量即數(shù)據(jù)類型是所有編程語(yǔ)言的概念和組成部分,WMLScript對(duì)此也不例外。它對(duì)其變量使用方法和數(shù)據(jù)類型定義方法給出了詳細(xì)的規(guī)定。變量通常與某數(shù)據(jù)之相對(duì)應(yīng),我們可以給變量賦值,并可在程序執(zhí)行中改變變量的值。下面我們講解WMLScript有關(guān)變量與數(shù)據(jù)類型的詳細(xì)規(guī)定。
4.4.1變量及其聲明
變量是在WMLScript腳本程序中具有值的符號(hào)名,或說(shuō)標(biāo)識(shí)符。使用變量可以存儲(chǔ)和改變程序中需要的數(shù)據(jù)。與C語(yǔ)言不同的是,WMLScript僅支持函數(shù)內(nèi)定義的變量或用于傳送數(shù)的參變量。
變量使用前必須進(jìn)行聲明,也就是定義變量,即指定變量的名字。聲明變量的關(guān)鍵字是var,它的后面根上作為變量名的合法的標(biāo)識(shí)符,并于最后加上分號(hào)(;),即完成一個(gè)量的聲明。聲明變量是可以使用var一次聲明多個(gè)變量名,相鄰變量之間使用都號(hào)(,)間隔。
一般情況下,我們?cè)诮o變量命名的時(shí)候,都希望能夠使用有意義的變量名。例如,當(dāng)需要使用一個(gè)變量表示一本書(shū)的價(jià)格時(shí),雖然將變量命名為j或book都沒(méi)有什么錯(cuò)誤,但若能命名為bookPrice則會(huì)是的WMLScript腳本程序具有更好的可讀性,可以方便編程人員進(jìn)行腳本的編寫(xiě)和調(diào)試工作。而且,由于WMLScript在給變量命名是不能使用保留字,所以考慮到避免由于一時(shí)的疏忽時(shí)變量名欲保留字發(fā)生沖突,我們建議使用多個(gè)單詞組合在以其作為一個(gè)變量的名稱,這是一個(gè)比較好的解決辦法。例如,如果要定義一個(gè)變量來(lái)存儲(chǔ)的、一本書(shū)的價(jià)格,那我們可以不妨使用bookPrice或者book_price作為變量的名稱,這樣,一方面可以時(shí)變量顯得更加清晰,另一方面也可以避免變量與保留字的沖突問(wèn)題。
以上只是我們對(duì)于變量命名的建議,并不是強(qiáng)制性的要求,用戶完全可以不按照我們的要求來(lái)做,只要遵守WMLScript對(duì)于標(biāo)識(shí)符命名的要求就可以了,但養(yǎng)成良好的編程風(fēng)格不論是對(duì)編程人員還是對(duì)腳本編寫(xiě)人員來(lái)說(shuō),都是十分有意義的。
4.4.2?變量的作用域與生命期
一個(gè)變量的作用域是指在程序中能夠引用這個(gè)變量的一段代碼。由于WMLScript僅支持函數(shù)內(nèi)定義的變量,所以WMLScript變量的作用與通常就是定義它們的那個(gè)函數(shù)。在該函數(shù)之外,變量不再發(fā)揮直接作用。
變量的生命起始值從變量聲明開(kāi)始到失效為止。變量的生命期也被稱為變量的持久期、存活期。一個(gè)變量在定義它的整個(gè)函數(shù)內(nèi)都是有效的,函數(shù)內(nèi)的任何語(yǔ)句塊都不會(huì)削減變量的生命期或限制變量的作用域。
如果一個(gè)變量未經(jīng)生命就直接使用,或聲明過(guò)后再次聲明,都會(huì)破壞變量的生命期。前一種情況會(huì)導(dǎo)致變量沒(méi)有開(kāi)始聲明期,即沒(méi)有“生命”;而后一種情況則導(dǎo)致變量聲明期沒(méi)有結(jié)束以前就重新賦予聲明期,即讓它多次“降生”。這都會(huì)導(dǎo)致變量無(wú)效使用。下面函數(shù)中的變量使用就說(shuō)明了這一問(wèn)題:
function?foo(){
x=1;//錯(cuò)誤:變量使用前沒(méi)有聲明,改變量還沒(méi)有“聲明”。
var?x,y,z;
y=x+3;
var?zd?=invalid
if(x){
var(y);//錯(cuò)誤:這一變量已經(jīng)聲明,這里是重復(fù)聲明。
};
};
4.4.3?變量的使用
WMLScript的變量只能在定義它的函數(shù)內(nèi)使用。使用時(shí)需要聲明變量,聲明變量是可以同時(shí)對(duì)變量賦值,甚至對(duì)變量進(jìn)行運(yùn)算。例如,下面的簡(jiǎn)單函數(shù)就說(shuō)明了變量的這種靈活的使用方法:
function?ourAge(){
var?myAge=38;
var?yourAge=26;
var?ourAge=myAge+yourAge;
return?ourAge;
};
使用變量時(shí)可通過(guò)調(diào)用變量名字的形式來(lái)實(shí)現(xiàn)。上面例子中的“var?ourAge=myAge+yourAge;”一句,通過(guò)調(diào)用變量名,變量ourAge對(duì)變量myAge和變量yourAge實(shí)行了求和操作。
4.4.4?變量類型與數(shù)據(jù)類型
WMLScript是一種“弱類型”的語(yǔ)言,及其變量沒(méi)有確定的類型。WMLScript變量的類型有改變量所賦數(shù)據(jù)的類型決定,并根據(jù)數(shù)據(jù)類型的改變而改變。WMLScript只支持內(nèi)部定義的數(shù)據(jù),因此我們編寫(xiě)程序是無(wú)需指定WMLScript變量的類型,WMLScript減根據(jù)變量而賦數(shù)據(jù)的類型自動(dòng)進(jìn)行匹配。由于WMLScript的數(shù)據(jù)類型共有整數(shù)、浮點(diǎn)數(shù)、字符串、布爾型和“無(wú)效型”五種類型,所以WMLScript變量的類型所能匹配的也就是這五種類型。
4.4.5?變量值域
由于變量類型尤其所賦數(shù)據(jù)的類型決定,所以變量值與域其所賦數(shù)據(jù)的可取范圍等價(jià)的。下面的我們就給出整數(shù)、浮點(diǎn)數(shù)、字符串和布爾型的區(qū)值范圍,以參照確定應(yīng)類型變量的值域。?1.整數(shù)的范圍。WMLScript支持的整數(shù)是32位的,也就是說(shuō)整數(shù)的區(qū)值范圍是從2147483648到+2147483647。我們可以在程序運(yùn)行期是用Lang函數(shù)來(lái)取得這些值,如:
Lang.maxInt();?//獲取最大的整數(shù)
Lang.maxInt();?//獲取最小的整數(shù)
2.浮點(diǎn)數(shù)的范圍。它是指WMLScript浮點(diǎn)數(shù)的精度所能表示的最小和最大數(shù)值WMLScript支持32為的單精度浮點(diǎn)數(shù),其最大至?xí)r3.40282347E+38,最小的非零的數(shù)是1.17549435E-38或更小(按照正常的精度)。
我們可以使用浮點(diǎn)Float函數(shù)庫(kù)在程序運(yùn)行其取得這些數(shù)值:
Float.maxFloa();?//獲得WMLScript所支持的最大浮點(diǎn)值
Float.maxFloa();?//獲得WMLScript所支持的最小浮點(diǎn)值
對(duì)于運(yùn)行期出現(xiàn)的一些特殊的浮點(diǎn)數(shù),WMLscript將按照下述規(guī)則處理:
其一,如果操作結(jié)果是一個(gè)不能被單精度浮點(diǎn)數(shù)所能表示的數(shù)值,那么該結(jié)果將被認(rèn)為是invalid,即無(wú)效值;
其二,如果操作結(jié)果發(fā)生下溢出,那么結(jié)果將作為0.0處理:
其三,負(fù)的零和正的零是完全相等的。
3.字符串的范圍。任何由于字母、數(shù)字或特殊字符組成的符號(hào)串都是WMLScript中定義的有關(guān)字符串的操作或String庫(kù)中的函數(shù)控制字符串。
4.布爾型數(shù)據(jù)的范圍。布爾型數(shù)據(jù)只有ture和flase兩個(gè)取值,這也是布爾型變量的兩種數(shù)值。我們可以使用布爾型數(shù)據(jù)取初始化或指定某一變量的數(shù)值,或?qū)⒉紶栔底兞繉?xiě)入一個(gè)需要布爾值作為參數(shù)的語(yǔ)句。布爾值可以是數(shù)值運(yùn)算的結(jié)果,也可以是邏輯運(yùn)算的結(jié)果。
下面就是定義布爾型變量并賦初值的例句:
var?truth=truth;
var?lie=!truth;
4.5?操作符與表達(dá)式
在WMLScript中,表達(dá)式可以把變量、常量與操作符結(jié)合起來(lái),經(jīng)過(guò)運(yùn)算能夠產(chǎn)生一定的運(yùn)算結(jié)果。表達(dá)式運(yùn)算后產(chǎn)生的結(jié)果可以是整數(shù)型、浮點(diǎn)數(shù)型、字符串型或布爾型的數(shù)據(jù)。其實(shí),對(duì)于表達(dá)式我們并不陌生,例如,1+2就是一個(gè)簡(jiǎn)單的表達(dá)式。
WMLScript的表達(dá)式主要有兩種類型。一種是賦值表達(dá)式,即把數(shù)據(jù)賦給變量的一種表達(dá)式,例如,myBook=3,在這個(gè)表達(dá)式中,將3?賦給變量myBook,同時(shí),這個(gè)表達(dá)式本身也有一個(gè)運(yùn)算結(jié)果,那就是3。另外一種是運(yùn)算表達(dá)式,它是指產(chǎn)生一個(gè)運(yùn)算結(jié)果而不進(jìn)行賦值操作的表達(dá)式,例如1+2就是一個(gè)運(yùn)算表達(dá)式,在這個(gè)表達(dá)式運(yùn)算產(chǎn)生的結(jié)果是3,?但這個(gè)表達(dá)式并沒(méi)有把運(yùn)算結(jié)果賦給變量。
在表達(dá)式運(yùn)算的過(guò)程中,表達(dá)式中操作一個(gè)或這兩個(gè)數(shù)據(jù)產(chǎn)生運(yùn)算的符號(hào)做操作符,被操作符操作的數(shù)據(jù)稱作操作數(shù),在WMLScript中我們會(huì)使用到各種操作符,下面就對(duì)操作符及有關(guān)的表達(dá)式進(jìn)行詳細(xì)講解。
4.5.1?賦值操作符
賦值操作符用于賦值操作,即給變量指定所需的數(shù)值,它能把有操作數(shù)的運(yùn)算結(jié)果給做操作數(shù),最簡(jiǎn)單的賦值操作符就是“=”,例如x=2,就是將2賦值給變量x。在如以下幾行語(yǔ)句都是賦值操作:
var=\"abc\";
var?b=a;
b=\"def\";
賦值操作符不需要指定使用對(duì)象,也不會(huì)改變賦值操作符右邊變量的數(shù)值。WMLScript的賦值操作符主要包括以下幾種:
1.=。用于賦值操作,將有操作數(shù)賦給左操作。
2?+=。將有操作數(shù)與左操作數(shù)進(jìn)行相見(jiàn)運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=3,那么x+=2運(yùn)算后的結(jié)果為x=5。
+=是比較特別的操作符,因?yàn)樗梢詫蓚€(gè)字符串相連,所以+=操作符也可以對(duì)字符串進(jìn)行操作,然后將連接后的字符串賦給左操作數(shù)。例如,假設(shè)x=\"Happy\",那么x+=\"new?Year\"運(yùn)算后結(jié)果是x=\"Happy?New?Year\"。
3.-=。將左操作數(shù)簡(jiǎn)取有操作數(shù),然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=3那么x-=運(yùn)算后的結(jié)果為x=1。
4*=。將左操作屬于有操作符進(jìn)行相乘運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=6,那么x*=2運(yùn)算后的結(jié)果為x=6。
5/=。將右操作屬于右操作符進(jìn)行相乘運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=6,那么x*=2運(yùn)算后的結(jié)果為x=6。
6div=。擁有操作數(shù)處理左操作數(shù),然后把運(yùn)算結(jié)果中的整數(shù)部分賦值給左操作數(shù),例如x=7,那么xdiv=2運(yùn)算后的結(jié)果為x=3。
7%=。功能是求余數(shù)并賦值,用右操作數(shù)除以做操作數(shù),最后把運(yùn)算得到的余數(shù)值給操作數(shù)。例如,假設(shè)x=7,那么x%=3運(yùn)算后的結(jié)果為x=1。
8<<=。功能是帶符號(hào)左位移并賦值,即將左操作和右操作數(shù)進(jìn)行左位移操作,在將結(jié)果賦給左操作數(shù)。
9>>=。可將左操作和右操作進(jìn)行右操作進(jìn)行補(bǔ)零右位移操作,在將結(jié)果賦給左操作數(shù)。
4.5.2?數(shù)學(xué)運(yùn)算操作符
數(shù)學(xué)運(yùn)算操作符可以對(duì)數(shù)值類型的操作數(shù)進(jìn)行運(yùn)算,然后返回一個(gè)數(shù)值類型的運(yùn)算結(jié)果。
1+。這是加運(yùn)算操作等,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的加法運(yùn)算,例如表達(dá)式1+2的運(yùn)算結(jié)果為3。
加操作符還可以對(duì)字符串類型的操作數(shù)進(jìn)行運(yùn)算,然后將兩個(gè)字符串相連起來(lái)作為運(yùn)算
2-?。即檢操作符,對(duì)應(yīng)著速學(xué)運(yùn)算中的減法運(yùn)算,例如表達(dá)式2-1的運(yùn)算結(jié)果為1。
同時(shí),“-”還是一個(gè)取負(fù)操作符,當(dāng)它作為取負(fù)操作符的是一個(gè)操作數(shù),取負(fù)操作符的功能使返回操作數(shù)的相反數(shù)。
3*。這是乘操作符,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的乘法運(yùn)算,例如表達(dá)式2*3的運(yùn)算結(jié)果為6。
4/。即除操作符,對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的除法運(yùn)算,但WMLScript中的除法運(yùn)算有些特別,在WMLScript中,除法運(yùn)算后的結(jié)果是一個(gè)浮點(diǎn)數(shù),而不想C語(yǔ)言或者Java語(yǔ)言那樣在整數(shù)進(jìn)行除法運(yùn)算式井運(yùn)算結(jié)果強(qiáng)行轉(zhuǎn)化整數(shù)。在WMLScript中,1/2=0.5,而在Jave中,1/2=0。
5div。這是整除操作符,對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的整數(shù)運(yùn)算,運(yùn)算后的結(jié)果一個(gè)整數(shù),這一點(diǎn)與C語(yǔ)言或者Java語(yǔ)言中的情況是一樣的,可以在整數(shù)進(jìn)行除法運(yùn)算式將運(yùn)算結(jié)果強(qiáng)行轉(zhuǎn)換整數(shù)。
6%。即取模操作符,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的取莫運(yùn)算,也就是將兩個(gè)操作相除,返回相除后的余數(shù)。
取模操作符主要用于判斷一個(gè)數(shù)字是否能被另一個(gè)數(shù)字整除。
((the?Year%3==0))&&(the?Year%100!=0))||(the?Year%400==0)
其中&&代表的是邏輯運(yùn)算中的與運(yùn)算,||代表的是邏輯運(yùn)算中的或運(yùn)算,關(guān)于邏輯運(yùn)算,我們后面會(huì)詳細(xì)介紹。
7++。這是遞增操作符,它只有一個(gè)操作數(shù),操作可以在操作符的左邊,也可以在操作符的右邊,它所完成的運(yùn)算操作是將操作數(shù)加1。假設(shè)操作數(shù)名稱為j,值為2,那么++j加1,然后返回j的值3;而j++則實(shí)現(xiàn)返回j的值2,然后將j加1。
在循環(huán)中,我們常常會(huì)用到遞增操作符的作用正好相反。遞減操作完成的運(yùn)算操作是經(jīng)操作數(shù)減1。例如,假設(shè)操作數(shù)名稱為j,值為2,那么--j先將j減1,然后返回的值1;而j--是先返回j的值2,然后將j減1。
4.5.3?位操作符
為操作符在運(yùn)算實(shí)現(xiàn)將操作轉(zhuǎn)化32位的二進(jìn)制數(shù),然后對(duì)每個(gè)操作數(shù)分別按位進(jìn)行運(yùn)算,運(yùn)算后在將二進(jìn)制的結(jié)果按照標(biāo)準(zhǔn)WMLScript數(shù)值類型返回運(yùn)算結(jié)束。
1&。這是為與操作符,它可以對(duì)兩個(gè)操作數(shù)按位進(jìn)行于操作,其運(yùn)算規(guī)則是:
0&0=0,0&1=0,1&0=0,1&1=1
2|。這是位或操作符,它可以對(duì)兩個(gè)操作數(shù)按位進(jìn)行或操作,運(yùn)算規(guī)則是:
0|0=0?,0|1=1,1|0=1,1|1=1
3^。這是唯一或操作符,它可以對(duì)兩個(gè)操作按位進(jìn)行異或操作,其運(yùn)算規(guī)則是:0^0=0,0^1=1,1^0=1,1^1=0
4~。這是位非操作符,它只有一個(gè)操作數(shù),可對(duì)操作數(shù)按位進(jìn)行非操作,運(yùn)算規(guī)則是:~0=1,~=0
5<<。這是左移操作,它可以對(duì)左操作數(shù)進(jìn)行向左一位的操作,由操作數(shù)給定了要移動(dòng)的位數(shù),在移動(dòng)過(guò)程中,左操作數(shù)的最低為補(bǔ)充0。
6>>。這是右移操作符,它可以對(duì)左操作數(shù)進(jìn)行向右移位的操作,由操作數(shù)給定要移動(dòng)的位數(shù),在移位的過(guò)程中,丟棄向右移的位。
7>>>。這是填0右移操作符,它與右移操作符相似。當(dāng)對(duì)證正數(shù)進(jìn)行操作時(shí),它們的效果完全相同;不同之處在于,當(dāng)進(jìn)行負(fù)整數(shù)右移操作時(shí),因?yàn)樨?fù)責(zé)轉(zhuǎn)化為二進(jìn)制后,最高為1,所以在進(jìn)行右移操作后,最高位仍然補(bǔ)充1,而在進(jìn)行填0右移操作時(shí),最高為補(bǔ)充的是0,因此,這是負(fù)數(shù)將轉(zhuǎn)化為正數(shù)。
4.5.4?邏輯操作符
邏輯操作符可以將布爾類型的表達(dá)式組合起來(lái),完成邏輯運(yùn)算操作,然后返回邏輯運(yùn)算的結(jié)果--真或假,這樣就可以完成比較復(fù)雜的邏輯判斷工作。邏輯操作共有3種;
1&&。即邏輯與操作符它只有在兩個(gè)操作數(shù)都為ture的時(shí)候,返回結(jié)果為ture,在其他情況下,返回結(jié)果為false或者invalid。
2||。這是或操作符,它在兩個(gè)操作數(shù)至少有一個(gè)為ture的時(shí)候,返回結(jié)果為ture,在其他情況下,返回結(jié)果為false或者invalid。
3!。即非操作符,它只有一個(gè)操作數(shù)。當(dāng)操作數(shù)為ture時(shí),返回結(jié)果為flase;返回結(jié)果為ture.
4.5.5?比較操作符
比較操作符可以把操作數(shù)進(jìn)行比較,然后返回一個(gè)邏輯值,表明這個(gè)比較操作的結(jié)果是否為真。比較操作的操作數(shù)可以是數(shù)值類型或者字符串類型的數(shù)據(jù)。比較操作符也常被稱為關(guān)系運(yùn)算符。
WMLScript支持的比較操作符共有6種,下面被介紹一下。
1.?==。即等于操作符,它可以比較兩個(gè)操作數(shù)是否相等。如果兩個(gè)操作數(shù)相等,則返回ture,否則返回false
2.?!=。即不等操作符。它可以比較兩個(gè)操作數(shù)是否相等。如果兩個(gè)操作數(shù)相等,則返回false,否則返回ture。
3.?>。即大于操作等。其運(yùn)算規(guī)則時(shí),如果左操作數(shù)大于右操作數(shù),則返回ture。
WML?Script是屬于無(wú)限應(yīng)用協(xié)議WAP應(yīng)用層的一部分,使用它可以向WML卡片組和卡片中添加客戶端的處理邏輯,目前最新的版本是1.1版。WML?Script1.1是在歐洲計(jì)算機(jī)制造商協(xié)議會(huì)制定的ECMAScript腳本語(yǔ)言的基礎(chǔ)上,經(jīng)過(guò)修改和優(yōu)化而指定的。它能夠更好的支持諸如移動(dòng)電話類的乍帶寬通信設(shè)備,在WML編程中使用WML?Script可以有效的增強(qiáng)客戶端應(yīng)用的靈活性,而且,我們也可以把WML?Script作為一個(gè)工具使用,開(kāi)發(fā)出功能強(qiáng)大的WAP網(wǎng)絡(luò)應(yīng)用和無(wú)限網(wǎng)頁(yè)。本章我們將詳細(xì)講解WML?Script1.1編程的基礎(chǔ)預(yù)法制時(shí),如基本規(guī)則、變量預(yù)數(shù)據(jù)類型、操作賦予表達(dá)式等。為了敘述上的簡(jiǎn)便,以后我們將“WML?Script1.1”簡(jiǎn)稱“WMLScript?薄?
4.1?WML?程序中調(diào)用WML?Script函數(shù)
經(jīng)過(guò)前兩章的學(xué)習(xí),熟悉C語(yǔ)言的讀者可能會(huì)認(rèn)識(shí)到,WML?的函數(shù)功能、邏輯運(yùn)算功能等都是十分有限的。而WMLScript提供了豐富的函數(shù)功能,我們?cè)赪AP應(yīng)用開(kāi)發(fā)可以使用WMLScript來(lái)增強(qiáng)WML編程。因此,WMLScript成為擴(kuò)展WML編程能力的主要開(kāi)發(fā)工具。
4.2?WMLScript的主要優(yōu)點(diǎn)及其字節(jié)碼解釋器
WMLScript具有一套定義好的字節(jié)碼和一個(gè)解釋器參考結(jié)構(gòu)。無(wú)線網(wǎng)絡(luò)傳輸中WMLScript的數(shù)據(jù)均以二進(jìn)制格式進(jìn)行傳輸,所以,用戶可以使用乍帶寬通信信道,從而能夠保持客戶端手機(jī)只需要最小限度的內(nèi)存。ECMAScript修改后得到的WMLScript能夠更快、更小、更容易的編譯程序?yàn)樽止?jié)碼形式。所有這些特點(diǎn),是WMLScript具備了WML所不能具備的很多優(yōu)點(diǎn)和功能。
4.2.1?使用WMLScript的主要優(yōu)點(diǎn)
WMLScript的設(shè)計(jì)宗旨是為WMLScript系統(tǒng)提供一般的腳本處理能力,使用WMLScript我們可以進(jìn)一步補(bǔ)充基于XML的WML語(yǔ)言的編程功能,開(kāi)發(fā)針對(duì)乍帶寬的網(wǎng)絡(luò)應(yīng)用及內(nèi)容,如文本、圖像、選擇列表等,我們可以使用簡(jiǎn)單的格式編寫(xiě)出更靈活和更具可讀性的用戶界面。WMLScript具備的WML所不能具備的優(yōu)點(diǎn)和功能,主要包括如下幾個(gè)方面:?(1)檢查用戶輸入的合法性:
(2)擴(kuò)展用戶瀏覽器的功能,比如允許程序員開(kāi)發(fā)手機(jī)的電話呼叫、發(fā)送短信息、存儲(chǔ)電話號(hào)碼、管理電話簿或SIM卡等;
(3)生成用戶端的確認(rèn)、提示、警告信息或操作對(duì)話框,并使之快速顯示在瀏覽器上;
(4)在用戶瀏覽器的更改后,能夠?qū)g覽器端的軟件和參數(shù)進(jìn)行擴(kuò)展與配置;
(5)最大程度克服客戶端的乍帶寬通信連接限制,并提供豐富的程序功能;
(6)補(bǔ)充WML并使之實(shí)現(xiàn)針對(duì)微型移動(dòng)終端設(shè)備的多種服務(wù),如支持高級(jí)用戶界面、增加客戶端智能型、提供用戶瀏覽器外圍功能的訪問(wèn)能力,以及在服務(wù)器與客戶端瀏覽傳輸數(shù)據(jù)是減少帶寬占用等。
4.2.2?WMLScript的字節(jié)碼解釋器
在WMLScript的字節(jié)碼解釋器解釋之前,WMLScript語(yǔ)言編寫(xiě)的文本格式的程序?qū)⒈皇紫染幾g為二進(jìn)制格式的代碼。編譯時(shí),編譯器通常先將WMLScript程序分成若干個(gè)編輯單位,每個(gè)單位的程序都包含一定數(shù)量的語(yǔ)句行和WMLScript函數(shù),然后,WMLScript的編譯器將按照這些編譯單位,逐一將WMLScript程序作為輸入內(nèi)容,而把對(duì)應(yīng)的字節(jié)碼作為輸出內(nèi)容。當(dāng)用戶通過(guò)WAP手機(jī)調(diào)用WMLScript程序時(shí),編譯器的編碼功能即被激活、執(zhí)行。
4.3?WMLScript基本規(guī)則
WMLScript在許多基本規(guī)則方面沿用了WML的做法。不過(guò),由于WMLScript是以C語(yǔ)言為藍(lán)本而指定的,所以它的語(yǔ)法特征和C語(yǔ)言非常相像。如果大家對(duì)C語(yǔ)言比較熟悉,那么學(xué)習(xí)和掌握這部分內(nèi)容應(yīng)當(dāng)是比較容易的。
4.3.1?WMLScript與URL
與WML一樣,WMLScript也沿用了WWW和HTML訪問(wèn)資源的URL、HTTP等規(guī)范,并擴(kuò)大了URL使用的范圍。在WMLScript中,不僅超鏈接、文件路徑即文件名可以作為URL處理,外部函數(shù)、訪問(wèn)控制信息等也可以作為URL處理。
為此,WMLScript采用了WML的變通方法,即改進(jìn)HTML命名資源為值的方式,采用程序段錨點(diǎn)(Fragment?Anchor)的形式來(lái)處理資源定位。程序段錨點(diǎn)根據(jù)文檔URL規(guī)則進(jìn)行定義,并按照程序段標(biāo)識(shí)符前加井字號(hào)(#)的方式書(shū)寫(xiě)。使用程序段錨點(diǎn),WMLScript程序可以在WMLScript編譯單位內(nèi)可任意指定的函數(shù),并可在調(diào)用該函數(shù)的同時(shí)傳遞所需的參數(shù)。
4.3.2?詞法結(jié)構(gòu)
WMLScript編程中的詞法結(jié)構(gòu)并不復(fù)雜,我們下面就從大小寫(xiě)敏感、空格、換行、注釋即保留字等方面講解相關(guān)的具體規(guī)則。
(1)內(nèi)容類型。WMLScript的內(nèi)容類型主要針對(duì)文件形式和二進(jìn)制形式兩種情況,類型結(jié)構(gòu)可以在服務(wù)器端進(jìn)行指定,具體形式為:
文本形式:text/vnd.wap.wmlscript;
二進(jìn)制形式:application/vnd.wap.wmlscriptc。
具體指定方法我們?cè)诘?章已經(jīng)介紹過(guò),這里不再重述。
(2)大小寫(xiě)敏感。WMLScript1.1是一種大小寫(xiě)敏感的腳本語(yǔ)言。它所設(shè)計(jì)的各種關(guān)鍵字、變量和函數(shù)名都必須合理的使用大小寫(xiě)。
(3)空格和換行。一般情況下,WMLScript程序值形式將忽略所有的空格、制表符合換行符等。但如果把這些特殊字符通過(guò)代碼進(jìn)行表述,或者作為字符串進(jìn)行處理時(shí),WMLScript將不再忽略它們。了如,字符串\"Oct?28,2001\"中含有空格,該空格在執(zhí)行時(shí)就不會(huì)被忽略,它與不含空格的字符串\"Oct28,2001\"是不同的。
(4)注釋。與WML編程一樣,在WMLScript腳本程序中也可以加入注釋內(nèi)容。注釋內(nèi)容不被程序執(zhí)行,且注釋不能嵌套。WMLScript的注釋方法有兩種:
其一,行注釋。即使用雙斜行號(hào)(//)引導(dǎo)以一行內(nèi)容,這一行內(nèi)容全部作為注釋內(nèi)容。如:
//這是以行注釋,由雙斜杠號(hào)開(kāi)始到結(jié)束都是注釋。
其二,塊選擇。即以符號(hào)“/*”開(kāi)始,而以符號(hào)“/*”結(jié)束的期間所有內(nèi)容都是注釋內(nèi)容。如:
/*這就是塊注釋,加在中間的內(nèi)容就是注釋內(nèi)容*/
(5)數(shù)據(jù)類型與直接編碼。WMLScript允許將4種類型的數(shù)據(jù)直接編碼并可嵌套并可嵌如在程序之中。直接編碼的4中數(shù)據(jù)類型為:整數(shù)、浮點(diǎn)數(shù)、字符串和布爾值。另外,“無(wú)效性”值也可直接編碼”?1.?整數(shù)。當(dāng)以十進(jìn)制、十六進(jìn)制或八進(jìn)制方式使用整數(shù)時(shí),可對(duì)這類整數(shù)進(jìn)行直接編碼。
編程序時(shí),十進(jìn)制的數(shù)字均不以0開(kāi)頭,只包含0~9的數(shù)值串;十六進(jìn)制的數(shù)據(jù)以O(shè)X或者Ox開(kāi)頭,只包含0~9、a~f或者A~F的字符串;八進(jìn)制的數(shù)均以0開(kāi)頭,只包含0~7的數(shù)字串。
2.浮點(diǎn)數(shù)。浮點(diǎn)數(shù)通常定義為含有小數(shù)點(diǎn)的數(shù)字,可以包含小數(shù)和指數(shù)部分。浮點(diǎn)數(shù)的形式較多,可以使十進(jìn)制的整數(shù)或浮點(diǎn)數(shù),可以是分?jǐn)?shù),也可以是指數(shù);但一個(gè)浮點(diǎn)數(shù)必須至少有一個(gè)數(shù)。
指數(shù)是以e或E開(kāi)頭,后面跟著一個(gè)整數(shù)。指數(shù)是以10為底冪。例如:e0時(shí)10的零次冪,例如:e0時(shí)10的另次冪,e-2時(shí)10的負(fù)2次冪集等于0.01。指數(shù)可以帶符號(hào),正好(+)或者減號(hào)(-),它們分別代表是正指數(shù)和負(fù)指數(shù)。
3.字符串。字符串是指定義在成對(duì)的雙引號(hào)(\"\")或單引號(hào)(‘?’)之間的內(nèi)容。
由于WMLScript只允許使用成對(duì)的雙引號(hào)或但引號(hào)來(lái)定義字符串,所以程序中使用一個(gè)單引號(hào)或一個(gè)雙引號(hào)時(shí)就會(huì)出現(xiàn)編譯錯(cuò)誤。
考慮到有些特殊字符不能在字符串中直接顯現(xiàn)出來(lái),所以WMLScript提供了轉(zhuǎn)譯序列來(lái)表示這些特殊字符。
4.布爾型。它只是ture和false兩個(gè)數(shù)值,用于表示W(wǎng)MLScript中的“真值”或“假值”。布爾型數(shù)據(jù)可參與異、或等運(yùn)算,具體規(guī)則我們后面介紹。
5.無(wú)效型。也稱為“空類型”,它是WMLScript支持的一個(gè)表示無(wú)效值的量,以invalid表示。該兩與C語(yǔ)言中的NULL類似。
4.保留字。WMLScript中定義有一個(gè)保留字集合,含有一些表示特殊意義的單詞這些次不能另外定義,也不能最為其他標(biāo)識(shí)符。WMLScript中的保留字如下:
acces?http?agent?if?break?isvalid?continue?meta?header
div?name?div=?path?domain?return?else?typeof?while
equiv?url?extern?use?for?user?function?var
另外,WMLScript還為將來(lái)的版本預(yù)留了一些保留字,主要有:
case?finally?catch?import?class?private?const?public?debugger
sizeof?default?struct?do?super?enum?switch?export?throw
extends?try
WMLScript還有一些沒(méi)有使用的保留字:
delete?null?in?this?lib?void?new?with
7.標(biāo)識(shí)符。WMLScript的標(biāo)識(shí)符可以指定或命名3種元素:變量、函數(shù)和標(biāo)注。標(biāo)識(shí)符不能以數(shù)字開(kāi)頭,但能一段下劃線(-)開(kāi)頭,而且,標(biāo)識(shí)符不能是WMLScript的保留字。例如,timeOfDay、speed?、quality、HOME_ADDRESS、_myName、__、varO等都是合法的標(biāo)識(shí)符;而以數(shù)字或非短下劃線的特殊符號(hào)開(kāi)頭的字串,以及保留字等都屬于不合法的標(biāo)志賦,如while、for、if、my~name、$sys、123、3piecs、take.this等。
由于WMLScript是嚴(yán)格區(qū)分大小寫(xiě)的,所以字母相同但大小寫(xiě)不同的標(biāo)識(shí)符不是同一個(gè)標(biāo)識(shí),例如,Work和work就是不同的標(biāo)識(shí)符。
8.名稱空間。WMLScript提供了比較自由的名稱空間,同一標(biāo)識(shí)符可以同時(shí)用作不同的目的。例如,作為某一函數(shù)名稱的標(biāo)識(shí)符,還可以同時(shí)用作變量名、函數(shù)參數(shù)、程序標(biāo)注等,使用時(shí)他們的屬性或值等并不相互影響。在下面的簡(jiǎn)單的例程中,myTest這一標(biāo)識(shí)符即用作了函數(shù)名,又用作了變量名、函數(shù)參數(shù)名、函數(shù)參數(shù)名、常量名。顯然,WMLScript的這一特定為我們編寫(xiě)程序提供了很大的方便。
4.3.3?WMLScript程序的基本書(shū)寫(xiě)規(guī)則
WMLScript程序的基本書(shū)本寫(xiě)規(guī)則:
1.程序由若干語(yǔ)句或函數(shù)組成,函數(shù)有由若干語(yǔ)句組成;
2.每個(gè)完整的語(yǔ)句后面必須加上分號(hào)(;),語(yǔ)句關(guān)鍵詞語(yǔ)操作數(shù)之間必須有空間;分號(hào)(;)是WMLScript程序的組成部分;
3.函數(shù)體之間必須使用成對(duì)的花括號(hào)({?})括起來(lái),而且函數(shù)結(jié)束時(shí)在右花括號(hào)(})的后面還要加上分號(hào)(;);函數(shù)說(shuō)明部分,如函數(shù)名、函數(shù)類型、函數(shù)參數(shù)等要放在花括號(hào)({})的前面;
4.有些語(yǔ)句可能也需要實(shí)用花括號(hào)({?})辦含內(nèi)容,這類語(yǔ)句通常也可以放在函數(shù)中,所以花括號(hào)({?})是可以嵌套的。
當(dāng)然,不同的語(yǔ)句、參數(shù)、變量等元素在聲明和書(shū)寫(xiě)時(shí)可能還有一些更細(xì)的要求,具體我們后面介紹這些元素是再專門(mén)給出,
4.4?變量與數(shù)據(jù)類型
變量即數(shù)據(jù)類型是所有編程語(yǔ)言的概念和組成部分,WMLScript對(duì)此也不例外。它對(duì)其變量使用方法和數(shù)據(jù)類型定義方法給出了詳細(xì)的規(guī)定。變量通常與某數(shù)據(jù)之相對(duì)應(yīng),我們可以給變量賦值,并可在程序執(zhí)行中改變變量的值。下面我們講解WMLScript有關(guān)變量與數(shù)據(jù)類型的詳細(xì)規(guī)定。
4.4.1變量及其聲明
變量是在WMLScript腳本程序中具有值的符號(hào)名,或說(shuō)標(biāo)識(shí)符。使用變量可以存儲(chǔ)和改變程序中需要的數(shù)據(jù)。與C語(yǔ)言不同的是,WMLScript僅支持函數(shù)內(nèi)定義的變量或用于傳送數(shù)的參變量。
變量使用前必須進(jìn)行聲明,也就是定義變量,即指定變量的名字。聲明變量的關(guān)鍵字是var,它的后面根上作為變量名的合法的標(biāo)識(shí)符,并于最后加上分號(hào)(;),即完成一個(gè)量的聲明。聲明變量是可以使用var一次聲明多個(gè)變量名,相鄰變量之間使用都號(hào)(,)間隔。
一般情況下,我們?cè)诮o變量命名的時(shí)候,都希望能夠使用有意義的變量名。例如,當(dāng)需要使用一個(gè)變量表示一本書(shū)的價(jià)格時(shí),雖然將變量命名為j或book都沒(méi)有什么錯(cuò)誤,但若能命名為bookPrice則會(huì)是的WMLScript腳本程序具有更好的可讀性,可以方便編程人員進(jìn)行腳本的編寫(xiě)和調(diào)試工作。而且,由于WMLScript在給變量命名是不能使用保留字,所以考慮到避免由于一時(shí)的疏忽時(shí)變量名欲保留字發(fā)生沖突,我們建議使用多個(gè)單詞組合在以其作為一個(gè)變量的名稱,這是一個(gè)比較好的解決辦法。例如,如果要定義一個(gè)變量來(lái)存儲(chǔ)的、一本書(shū)的價(jià)格,那我們可以不妨使用bookPrice或者book_price作為變量的名稱,這樣,一方面可以時(shí)變量顯得更加清晰,另一方面也可以避免變量與保留字的沖突問(wèn)題。
以上只是我們對(duì)于變量命名的建議,并不是強(qiáng)制性的要求,用戶完全可以不按照我們的要求來(lái)做,只要遵守WMLScript對(duì)于標(biāo)識(shí)符命名的要求就可以了,但養(yǎng)成良好的編程風(fēng)格不論是對(duì)編程人員還是對(duì)腳本編寫(xiě)人員來(lái)說(shuō),都是十分有意義的。
4.4.2?變量的作用域與生命期
一個(gè)變量的作用域是指在程序中能夠引用這個(gè)變量的一段代碼。由于WMLScript僅支持函數(shù)內(nèi)定義的變量,所以WMLScript變量的作用與通常就是定義它們的那個(gè)函數(shù)。在該函數(shù)之外,變量不再發(fā)揮直接作用。
變量的生命起始值從變量聲明開(kāi)始到失效為止。變量的生命期也被稱為變量的持久期、存活期。一個(gè)變量在定義它的整個(gè)函數(shù)內(nèi)都是有效的,函數(shù)內(nèi)的任何語(yǔ)句塊都不會(huì)削減變量的生命期或限制變量的作用域。
如果一個(gè)變量未經(jīng)生命就直接使用,或聲明過(guò)后再次聲明,都會(huì)破壞變量的生命期。前一種情況會(huì)導(dǎo)致變量沒(méi)有開(kāi)始聲明期,即沒(méi)有“生命”;而后一種情況則導(dǎo)致變量聲明期沒(méi)有結(jié)束以前就重新賦予聲明期,即讓它多次“降生”。這都會(huì)導(dǎo)致變量無(wú)效使用。下面函數(shù)中的變量使用就說(shuō)明了這一問(wèn)題:
function?foo(){
x=1;//錯(cuò)誤:變量使用前沒(méi)有聲明,改變量還沒(méi)有“聲明”。
var?x,y,z;
y=x+3;
var?zd?=invalid
if(x){
var(y);//錯(cuò)誤:這一變量已經(jīng)聲明,這里是重復(fù)聲明。
};
};
4.4.3?變量的使用
WMLScript的變量只能在定義它的函數(shù)內(nèi)使用。使用時(shí)需要聲明變量,聲明變量是可以同時(shí)對(duì)變量賦值,甚至對(duì)變量進(jìn)行運(yùn)算。例如,下面的簡(jiǎn)單函數(shù)就說(shuō)明了變量的這種靈活的使用方法:
function?ourAge(){
var?myAge=38;
var?yourAge=26;
var?ourAge=myAge+yourAge;
return?ourAge;
};
使用變量時(shí)可通過(guò)調(diào)用變量名字的形式來(lái)實(shí)現(xiàn)。上面例子中的“var?ourAge=myAge+yourAge;”一句,通過(guò)調(diào)用變量名,變量ourAge對(duì)變量myAge和變量yourAge實(shí)行了求和操作。
4.4.4?變量類型與數(shù)據(jù)類型
WMLScript是一種“弱類型”的語(yǔ)言,及其變量沒(méi)有確定的類型。WMLScript變量的類型有改變量所賦數(shù)據(jù)的類型決定,并根據(jù)數(shù)據(jù)類型的改變而改變。WMLScript只支持內(nèi)部定義的數(shù)據(jù),因此我們編寫(xiě)程序是無(wú)需指定WMLScript變量的類型,WMLScript減根據(jù)變量而賦數(shù)據(jù)的類型自動(dòng)進(jìn)行匹配。由于WMLScript的數(shù)據(jù)類型共有整數(shù)、浮點(diǎn)數(shù)、字符串、布爾型和“無(wú)效型”五種類型,所以WMLScript變量的類型所能匹配的也就是這五種類型。
4.4.5?變量值域
由于變量類型尤其所賦數(shù)據(jù)的類型決定,所以變量值與域其所賦數(shù)據(jù)的可取范圍等價(jià)的。下面的我們就給出整數(shù)、浮點(diǎn)數(shù)、字符串和布爾型的區(qū)值范圍,以參照確定應(yīng)類型變量的值域。?1.整數(shù)的范圍。WMLScript支持的整數(shù)是32位的,也就是說(shuō)整數(shù)的區(qū)值范圍是從2147483648到+2147483647。我們可以在程序運(yùn)行期是用Lang函數(shù)來(lái)取得這些值,如:
Lang.maxInt();?//獲取最大的整數(shù)
Lang.maxInt();?//獲取最小的整數(shù)
2.浮點(diǎn)數(shù)的范圍。它是指WMLScript浮點(diǎn)數(shù)的精度所能表示的最小和最大數(shù)值WMLScript支持32為的單精度浮點(diǎn)數(shù),其最大至?xí)r3.40282347E+38,最小的非零的數(shù)是1.17549435E-38或更小(按照正常的精度)。
我們可以使用浮點(diǎn)Float函數(shù)庫(kù)在程序運(yùn)行其取得這些數(shù)值:
Float.maxFloa();?//獲得WMLScript所支持的最大浮點(diǎn)值
Float.maxFloa();?//獲得WMLScript所支持的最小浮點(diǎn)值
對(duì)于運(yùn)行期出現(xiàn)的一些特殊的浮點(diǎn)數(shù),WMLscript將按照下述規(guī)則處理:
其一,如果操作結(jié)果是一個(gè)不能被單精度浮點(diǎn)數(shù)所能表示的數(shù)值,那么該結(jié)果將被認(rèn)為是invalid,即無(wú)效值;
其二,如果操作結(jié)果發(fā)生下溢出,那么結(jié)果將作為0.0處理:
其三,負(fù)的零和正的零是完全相等的。
3.字符串的范圍。任何由于字母、數(shù)字或特殊字符組成的符號(hào)串都是WMLScript中定義的有關(guān)字符串的操作或String庫(kù)中的函數(shù)控制字符串。
4.布爾型數(shù)據(jù)的范圍。布爾型數(shù)據(jù)只有ture和flase兩個(gè)取值,這也是布爾型變量的兩種數(shù)值。我們可以使用布爾型數(shù)據(jù)取初始化或指定某一變量的數(shù)值,或?qū)⒉紶栔底兞繉?xiě)入一個(gè)需要布爾值作為參數(shù)的語(yǔ)句。布爾值可以是數(shù)值運(yùn)算的結(jié)果,也可以是邏輯運(yùn)算的結(jié)果。
下面就是定義布爾型變量并賦初值的例句:
var?truth=truth;
var?lie=!truth;
4.5?操作符與表達(dá)式
在WMLScript中,表達(dá)式可以把變量、常量與操作符結(jié)合起來(lái),經(jīng)過(guò)運(yùn)算能夠產(chǎn)生一定的運(yùn)算結(jié)果。表達(dá)式運(yùn)算后產(chǎn)生的結(jié)果可以是整數(shù)型、浮點(diǎn)數(shù)型、字符串型或布爾型的數(shù)據(jù)。其實(shí),對(duì)于表達(dá)式我們并不陌生,例如,1+2就是一個(gè)簡(jiǎn)單的表達(dá)式。
WMLScript的表達(dá)式主要有兩種類型。一種是賦值表達(dá)式,即把數(shù)據(jù)賦給變量的一種表達(dá)式,例如,myBook=3,在這個(gè)表達(dá)式中,將3?賦給變量myBook,同時(shí),這個(gè)表達(dá)式本身也有一個(gè)運(yùn)算結(jié)果,那就是3。另外一種是運(yùn)算表達(dá)式,它是指產(chǎn)生一個(gè)運(yùn)算結(jié)果而不進(jìn)行賦值操作的表達(dá)式,例如1+2就是一個(gè)運(yùn)算表達(dá)式,在這個(gè)表達(dá)式運(yùn)算產(chǎn)生的結(jié)果是3,?但這個(gè)表達(dá)式并沒(méi)有把運(yùn)算結(jié)果賦給變量。
在表達(dá)式運(yùn)算的過(guò)程中,表達(dá)式中操作一個(gè)或這兩個(gè)數(shù)據(jù)產(chǎn)生運(yùn)算的符號(hào)做操作符,被操作符操作的數(shù)據(jù)稱作操作數(shù),在WMLScript中我們會(huì)使用到各種操作符,下面就對(duì)操作符及有關(guān)的表達(dá)式進(jìn)行詳細(xì)講解。
4.5.1?賦值操作符
賦值操作符用于賦值操作,即給變量指定所需的數(shù)值,它能把有操作數(shù)的運(yùn)算結(jié)果給做操作數(shù),最簡(jiǎn)單的賦值操作符就是“=”,例如x=2,就是將2賦值給變量x。在如以下幾行語(yǔ)句都是賦值操作:
var=\"abc\";
var?b=a;
b=\"def\";
賦值操作符不需要指定使用對(duì)象,也不會(huì)改變賦值操作符右邊變量的數(shù)值。WMLScript的賦值操作符主要包括以下幾種:
1.=。用于賦值操作,將有操作數(shù)賦給左操作。
2?+=。將有操作數(shù)與左操作數(shù)進(jìn)行相見(jiàn)運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=3,那么x+=2運(yùn)算后的結(jié)果為x=5。
+=是比較特別的操作符,因?yàn)樗梢詫蓚€(gè)字符串相連,所以+=操作符也可以對(duì)字符串進(jìn)行操作,然后將連接后的字符串賦給左操作數(shù)。例如,假設(shè)x=\"Happy\",那么x+=\"new?Year\"運(yùn)算后結(jié)果是x=\"Happy?New?Year\"。
3.-=。將左操作數(shù)簡(jiǎn)取有操作數(shù),然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=3那么x-=運(yùn)算后的結(jié)果為x=1。
4*=。將左操作屬于有操作符進(jìn)行相乘運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=6,那么x*=2運(yùn)算后的結(jié)果為x=6。
5/=。將右操作屬于右操作符進(jìn)行相乘運(yùn)算,然后把運(yùn)算結(jié)果賦值給左操作數(shù)。例如,假設(shè)x=6,那么x*=2運(yùn)算后的結(jié)果為x=6。
6div=。擁有操作數(shù)處理左操作數(shù),然后把運(yùn)算結(jié)果中的整數(shù)部分賦值給左操作數(shù),例如x=7,那么xdiv=2運(yùn)算后的結(jié)果為x=3。
7%=。功能是求余數(shù)并賦值,用右操作數(shù)除以做操作數(shù),最后把運(yùn)算得到的余數(shù)值給操作數(shù)。例如,假設(shè)x=7,那么x%=3運(yùn)算后的結(jié)果為x=1。
8<<=。功能是帶符號(hào)左位移并賦值,即將左操作和右操作數(shù)進(jìn)行左位移操作,在將結(jié)果賦給左操作數(shù)。
9>>=。可將左操作和右操作進(jìn)行右操作進(jìn)行補(bǔ)零右位移操作,在將結(jié)果賦給左操作數(shù)。
4.5.2?數(shù)學(xué)運(yùn)算操作符
數(shù)學(xué)運(yùn)算操作符可以對(duì)數(shù)值類型的操作數(shù)進(jìn)行運(yùn)算,然后返回一個(gè)數(shù)值類型的運(yùn)算結(jié)果。
1+。這是加運(yùn)算操作等,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的加法運(yùn)算,例如表達(dá)式1+2的運(yùn)算結(jié)果為3。
加操作符還可以對(duì)字符串類型的操作數(shù)進(jìn)行運(yùn)算,然后將兩個(gè)字符串相連起來(lái)作為運(yùn)算
2-?。即檢操作符,對(duì)應(yīng)著速學(xué)運(yùn)算中的減法運(yùn)算,例如表達(dá)式2-1的運(yùn)算結(jié)果為1。
同時(shí),“-”還是一個(gè)取負(fù)操作符,當(dāng)它作為取負(fù)操作符的是一個(gè)操作數(shù),取負(fù)操作符的功能使返回操作數(shù)的相反數(shù)。
3*。這是乘操作符,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的乘法運(yùn)算,例如表達(dá)式2*3的運(yùn)算結(jié)果為6。
4/。即除操作符,對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的除法運(yùn)算,但WMLScript中的除法運(yùn)算有些特別,在WMLScript中,除法運(yùn)算后的結(jié)果是一個(gè)浮點(diǎn)數(shù),而不想C語(yǔ)言或者Java語(yǔ)言那樣在整數(shù)進(jìn)行除法運(yùn)算式井運(yùn)算結(jié)果強(qiáng)行轉(zhuǎn)化整數(shù)。在WMLScript中,1/2=0.5,而在Jave中,1/2=0。
5div。這是整除操作符,對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的整數(shù)運(yùn)算,運(yùn)算后的結(jié)果一個(gè)整數(shù),這一點(diǎn)與C語(yǔ)言或者Java語(yǔ)言中的情況是一樣的,可以在整數(shù)進(jìn)行除法運(yùn)算式將運(yùn)算結(jié)果強(qiáng)行轉(zhuǎn)換整數(shù)。
6%。即取模操作符,它對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的取莫運(yùn)算,也就是將兩個(gè)操作相除,返回相除后的余數(shù)。
取模操作符主要用于判斷一個(gè)數(shù)字是否能被另一個(gè)數(shù)字整除。
((the?Year%3==0))&&(the?Year%100!=0))||(the?Year%400==0)
其中&&代表的是邏輯運(yùn)算中的與運(yùn)算,||代表的是邏輯運(yùn)算中的或運(yùn)算,關(guān)于邏輯運(yùn)算,我們后面會(huì)詳細(xì)介紹。
7++。這是遞增操作符,它只有一個(gè)操作數(shù),操作可以在操作符的左邊,也可以在操作符的右邊,它所完成的運(yùn)算操作是將操作數(shù)加1。假設(shè)操作數(shù)名稱為j,值為2,那么++j加1,然后返回j的值3;而j++則實(shí)現(xiàn)返回j的值2,然后將j加1。
在循環(huán)中,我們常常會(huì)用到遞增操作符的作用正好相反。遞減操作完成的運(yùn)算操作是經(jīng)操作數(shù)減1。例如,假設(shè)操作數(shù)名稱為j,值為2,那么--j先將j減1,然后返回的值1;而j--是先返回j的值2,然后將j減1。
4.5.3?位操作符
為操作符在運(yùn)算實(shí)現(xiàn)將操作轉(zhuǎn)化32位的二進(jìn)制數(shù),然后對(duì)每個(gè)操作數(shù)分別按位進(jìn)行運(yùn)算,運(yùn)算后在將二進(jìn)制的結(jié)果按照標(biāo)準(zhǔn)WMLScript數(shù)值類型返回運(yùn)算結(jié)束。
1&。這是為與操作符,它可以對(duì)兩個(gè)操作數(shù)按位進(jìn)行于操作,其運(yùn)算規(guī)則是:
0&0=0,0&1=0,1&0=0,1&1=1
2|。這是位或操作符,它可以對(duì)兩個(gè)操作數(shù)按位進(jìn)行或操作,運(yùn)算規(guī)則是:
0|0=0?,0|1=1,1|0=1,1|1=1
3^。這是唯一或操作符,它可以對(duì)兩個(gè)操作按位進(jìn)行異或操作,其運(yùn)算規(guī)則是:0^0=0,0^1=1,1^0=1,1^1=0
4~。這是位非操作符,它只有一個(gè)操作數(shù),可對(duì)操作數(shù)按位進(jìn)行非操作,運(yùn)算規(guī)則是:~0=1,~=0
5<<。這是左移操作,它可以對(duì)左操作數(shù)進(jìn)行向左一位的操作,由操作數(shù)給定了要移動(dòng)的位數(shù),在移動(dòng)過(guò)程中,左操作數(shù)的最低為補(bǔ)充0。
6>>。這是右移操作符,它可以對(duì)左操作數(shù)進(jìn)行向右移位的操作,由操作數(shù)給定要移動(dòng)的位數(shù),在移位的過(guò)程中,丟棄向右移的位。
7>>>。這是填0右移操作符,它與右移操作符相似。當(dāng)對(duì)證正數(shù)進(jìn)行操作時(shí),它們的效果完全相同;不同之處在于,當(dāng)進(jìn)行負(fù)整數(shù)右移操作時(shí),因?yàn)樨?fù)責(zé)轉(zhuǎn)化為二進(jìn)制后,最高為1,所以在進(jìn)行右移操作后,最高位仍然補(bǔ)充1,而在進(jìn)行填0右移操作時(shí),最高為補(bǔ)充的是0,因此,這是負(fù)數(shù)將轉(zhuǎn)化為正數(shù)。
4.5.4?邏輯操作符
邏輯操作符可以將布爾類型的表達(dá)式組合起來(lái),完成邏輯運(yùn)算操作,然后返回邏輯運(yùn)算的結(jié)果--真或假,這樣就可以完成比較復(fù)雜的邏輯判斷工作。邏輯操作共有3種;
1&&。即邏輯與操作符它只有在兩個(gè)操作數(shù)都為ture的時(shí)候,返回結(jié)果為ture,在其他情況下,返回結(jié)果為false或者invalid。
2||。這是或操作符,它在兩個(gè)操作數(shù)至少有一個(gè)為ture的時(shí)候,返回結(jié)果為ture,在其他情況下,返回結(jié)果為false或者invalid。
3!。即非操作符,它只有一個(gè)操作數(shù)。當(dāng)操作數(shù)為ture時(shí),返回結(jié)果為flase;返回結(jié)果為ture.
4.5.5?比較操作符
比較操作符可以把操作數(shù)進(jìn)行比較,然后返回一個(gè)邏輯值,表明這個(gè)比較操作的結(jié)果是否為真。比較操作的操作數(shù)可以是數(shù)值類型或者字符串類型的數(shù)據(jù)。比較操作符也常被稱為關(guān)系運(yùn)算符。
WMLScript支持的比較操作符共有6種,下面被介紹一下。
1.?==。即等于操作符,它可以比較兩個(gè)操作數(shù)是否相等。如果兩個(gè)操作數(shù)相等,則返回ture,否則返回false
2.?!=。即不等操作符。它可以比較兩個(gè)操作數(shù)是否相等。如果兩個(gè)操作數(shù)相等,則返回false,否則返回ture。
3.?>。即大于操作等。其運(yùn)算規(guī)則時(shí),如果左操作數(shù)大于右操作數(shù),則返回ture。