国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
vbscript 教程
[轉(zhuǎn)帖]vbscript 教程 dyle_gg,2004-12-02 14:10:46

第2章  VBScript基礎(chǔ)
本書主要通過大量實(shí)例講解VBScript與JScript編程。從本章開始我們先用5章的篇幅講解VBScript,以后各章再講解JScript。本章我們先來初步認(rèn)識(shí)VBScript的基本情況,并學(xué)習(xí)VBScript語言的基礎(chǔ)知識(shí),包括該語言的數(shù)據(jù)類型、常量和變量的一些規(guī)定、表達(dá)式與運(yùn)算符等。
2.1  使用VBScript
VBScript作為一種腳本語言,可以自由嵌入任何支持該語言的應(yīng)用程序中,以增強(qiáng)應(yīng)用程序的功能,其應(yīng)用領(lǐng)域十分廣泛。本節(jié)我們通過一個(gè)實(shí)例,說明在HTML網(wǎng)頁中使用VBScript的基本方法。
2.1.1  VBScript及其主要功能
VBScript是Visual Basic程序設(shè)計(jì)語言家族中的新成員,它以Visual Basic語言為基礎(chǔ)提供了編程的功能,在腳本開發(fā)的場(chǎng)合中,VBScript得到了廣泛的應(yīng)用,其中包括在Internet Explorer瀏覽器上編寫客戶端腳本,也包括在Internet Information Server上編寫服務(wù)器端腳本。
在最初的設(shè)計(jì)中,VBScript是通過編寫事件驅(qū)動(dòng)的腳本來擴(kuò)大客戶端HTML功能,編寫客戶端腳本最大的優(yōu)點(diǎn)就在于由瀏覽器解釋執(zhí)行,不需要增大服務(wù)器的負(fù)擔(dān)。例如,我們可以在客戶端進(jìn)行輸入數(shù)據(jù)有效性驗(yàn)證,防止瀏覽器將無效數(shù)據(jù)發(fā)送給服務(wù)器。這樣,一方面可以減輕服務(wù)器的負(fù)擔(dān),防止服務(wù)器陷入處理大量無意義數(shù)據(jù)的工作中,同樣,也可以減輕網(wǎng)絡(luò)的阻塞;另外一方面,也能夠使客戶減少等待時(shí)間,在驗(yàn)證的時(shí)候,瀏覽器能夠立即作出響應(yīng),而如果在服務(wù)器上進(jìn)行驗(yàn)證,那用戶則不得不在瀏覽器前等待,服務(wù)器的處理和網(wǎng)絡(luò)的傳輸都需要耗費(fèi)一定的時(shí)間。
隨著IIS 3.0和ASP技術(shù)的出現(xiàn),VBScript將它的功能擴(kuò)展到服務(wù)器上,VBScript開發(fā)的腳本可以在服務(wù)器上解釋執(zhí)行。在服務(wù)器端腳本開發(fā)的過程中,使用VBScript則沒有客戶端腳本開發(fā)時(shí)的局限性,當(dāng)客戶請(qǐng)求頁面時(shí),頁面將在服務(wù)器上執(zhí)行,然后再反饋給瀏覽器,瀏覽器所獲得的只是標(biāo)準(zhǔn)HTML文件,這樣就可以不受到瀏覽器不支持的限制。和Visual Basic語言一樣,VBScript語言是大小寫不敏感的,例如,當(dāng)我們需要在頁面中引用Server對(duì)象的時(shí)候,我們使用SERVER和server都是可以的,如果我們將兩個(gè)變量定義為Book和book,在C語言中,這將被視為兩個(gè)不同的變量,可是在VBScript中,它們只會(huì)被視為一個(gè)變量。
VBScript使用ActiveX Script(即ActiveX腳本)與宿主應(yīng)用程序?qū)υ挕J褂肁ctiveX Script,瀏覽器和其他宿主應(yīng)用程序不再需要每個(gè)Script部件的特殊集成代碼。ActiveX Script使宿主可以編譯Script、獲取和調(diào)用入口點(diǎn)及管理開發(fā)者可用的命名空間。通過ActiveX Script,語言廠商可以建立標(biāo)準(zhǔn)Script運(yùn)行時(shí)語言。
VBScript可以和HTML頁面完美地結(jié)合在一起,運(yùn)用VBScript可以控制HTML頁面,并對(duì)頁面中某些事件作出響應(yīng),例如,可以在頁面的表單提交時(shí)進(jìn)行數(shù)據(jù)有效性驗(yàn)證。VBScript還提供了許多對(duì)象和瀏覽器的對(duì)象,運(yùn)用這些對(duì)象,可以方便地進(jìn)行腳本的編寫,實(shí)現(xiàn)一些其他語言所無法實(shí)現(xiàn)的功能。
那么,VBScript究竟有哪些用途呢?下面我們先列舉幾種情況,在實(shí)際使用中,讀者也許會(huì)發(fā)現(xiàn),還會(huì)有更多的情況下會(huì)用到VBScript。
(1) 創(chuàng)建生動(dòng)的用戶界面。在一個(gè)制作精美的頁面中,為了使頁面生動(dòng)活潑,往往需要按鈕在被按下時(shí)作出某些響應(yīng),那應(yīng)該如何處理呢?當(dāng)然我們可以采用表單中的按鈕,這種按鈕的確能夠有效地實(shí)現(xiàn)所要實(shí)現(xiàn)的功能,但這種按鈕往往會(huì)破壞整個(gè)頁面的和諧美觀。我們也可以采用超鏈接來實(shí)現(xiàn),但超鏈接只能夠?qū)崿F(xiàn)按鈕被按下的結(jié)果,而不能展現(xiàn)按鈕從按下到彈起的整個(gè)過程。運(yùn)用VBScript,我們可以采用圖片來實(shí)現(xiàn)這個(gè)功能,首先我們應(yīng)該制作兩幅圖片,一幅是按鈕正常狀態(tài)的圖片,一幅是按鈕被按下的圖片,一開始時(shí)在頁面上放置正常狀態(tài)的圖片,當(dāng)鼠標(biāo)在圖片上按下時(shí),圖片切換為被按下的圖片,當(dāng)鼠標(biāo)松開時(shí)再切換為正常狀態(tài)的圖片,這樣就能夠完美地解決這個(gè)問題,既保持頁面的美觀,又使頁面變得生動(dòng)活潑。
(2) 數(shù)據(jù)有效性驗(yàn)證工作。當(dāng)用戶填寫表單并提交表單數(shù)據(jù)時(shí),可能因?yàn)橛脩舻氖韬龆兴z漏,或者由于用戶的玩笑而填入了無效的數(shù)據(jù),對(duì)這種情況應(yīng)該如何處理呢?當(dāng)然,表單的數(shù)據(jù)會(huì)送往服務(wù)器上的CGI程序,我們可以在CGI程序的處理時(shí)進(jìn)行數(shù)據(jù)有效性驗(yàn)證,然后將結(jié)果反饋給用戶,但如果是用戶的疏忽而引起的,那么他將等待一段時(shí)間后才能得到反饋結(jié)果,用戶當(dāng)然不希望有這段時(shí)間的等待;如果是用戶的玩笑而引起的,Web管理員也不希望這種毫無意義的數(shù)據(jù)送到服務(wù)器上加重服務(wù)器的負(fù)擔(dān)。我們可以運(yùn)用VBScript在客戶端進(jìn)行一次數(shù)據(jù)有效性驗(yàn)證,不論是遺漏了某些數(shù)據(jù),還是填入了無效數(shù)據(jù),都可以在表單提交前檢驗(yàn)出來,立即反饋給用戶,而不將無效的數(shù)據(jù)發(fā)向服務(wù)器。
(3) 數(shù)據(jù)查找。許多頁面中都有搜索的功能。當(dāng)用戶填入關(guān)鍵詞后,瀏覽器將關(guān)鍵詞發(fā)送給服務(wù)器,服務(wù)器上的數(shù)據(jù)庫搜索引擎立即開始工作,然后將檢索結(jié)果以HTML頁面的形式反饋給瀏覽器。這種方案當(dāng)然沒有什么不妥,但在數(shù)據(jù)量不大的情況下,比如只是在幾十條數(shù)據(jù)中進(jìn)行檢索,雖然它也能夠?qū)崿F(xiàn)數(shù)據(jù)查找的功能,但和用戶的等待時(shí)間、服務(wù)器加重的負(fù)載相比起來,采用這種方案是否有些得不償失呢?既然數(shù)據(jù)量不大,運(yùn)用VBScript,我們可以將數(shù)據(jù)存放在頁面中,用戶填入關(guān)鍵詞后并不送往服務(wù)器,而是在客戶端直接進(jìn)行查找,然后直接在客戶端將檢索結(jié)果反饋給用戶。
2.1.2  在HTML中頁面使用VBScript
前面已經(jīng)提到,VBScript不能用來編寫單獨(dú)的應(yīng)用程序,它必須嵌入到HTML頁面中去。嵌入時(shí)必須使用SCRIPT元素將VBScript代碼添加到HTML頁面中。同時(shí),VBScript代碼要寫在成對(duì)的<SCRIPT>標(biāo)記之間。例如,以下代碼為一個(gè)測(cè)試傳遞日期的過程:

<SCRIPT LANGUAGE="VBScript">
<!--
   Function CanDeliver(Dt)
      CanDeliver = (CDate(Dt) - Now()) > 2
   End Function
-->
</SCRIPT>

可以看到,代碼的開始和結(jié)束部分都有<SCRIPT>標(biāo)記。另外,LANGUAGE屬性用于指定所使用的Script語言。由于瀏覽器能夠使用多種Script語言,所以必須在此指定所使用的Script語言。當(dāng)然,由于VBScript是IE瀏覽器使用的默認(rèn)的腳本語言,所以當(dāng)確保使用IE瀏覽器瀏覽時(shí)可以不使用LANGUAGE屬性來指定VBScript,但為了能適應(yīng)其他瀏覽器,建議用戶還是指定一下。
如果我們?cè)僮⒁庖幌律鲜鯲BScript腳本,就會(huì)發(fā)現(xiàn)VBScript代碼被加上了注釋標(biāo)記(<!-- 和 -->)。如:
<SCRIPT LANGUAGE=VBScript>
<!--
    VBScript Code
-- >
</SCRIPT>
加上注釋標(biāo)記是因?yàn)閷?duì)于不支持VBScript的瀏覽器來說,不能識(shí)別標(biāo)簽<SCRIPT>,如果不加上注釋的話,VBScript腳本會(huì)被作為文本而直接顯示在頁面上,而加入了注釋標(biāo)簽之后,這部分不被支持的代碼就將被忽略,<SCRIPT>和</SCRIPT>標(biāo)簽也是不能被識(shí)別的,因此一概忽略。但是對(duì)于可以識(shí)別VBScript代碼的瀏覽器而言,即使加了注釋標(biāo)簽,也能識(shí)別出處于注釋標(biāo)簽內(nèi)的VBScript代碼。一般,我們完全不必那樣做,不過為了以防萬一,我們最好養(yǎng)成這個(gè)好習(xí)慣。
因?yàn)橐陨蠝y(cè)試傳遞日期的示例是一個(gè)通用函數(shù),即不依賴于任何窗體控件,所以可以將其包含在HTML頁面的HEAD部分:

<HTML>
<HEAD>
<TITLE>訂購(gòu)</TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
   Function CanDeliver(Dt)
      CanDeliver = (CDate(Dt) - Now()) > 2
   End Function
-->
</SCRIPT>
</HEAD>
<BODY>
...

SCRIPT塊可以出現(xiàn)在HTML頁面的任何地方,如BODY或HEAD部分之中。然而,最好是將所有的一般目標(biāo)Script代碼放在HEAD部分中,以使所有Script代碼集中放置。這樣可以確保在BODY部分調(diào)用代碼之前所有Script代碼都被讀取并解碼。
上述規(guī)則的一個(gè)值得注意的例外情況是,在窗體中提供內(nèi)部代碼以響應(yīng)窗體中對(duì)象的事件。例如,以下示例在窗體中嵌入Script代碼以響應(yīng)窗體中按鈕的單擊事件:

<HTML>
<HEAD>
<TITLE>測(cè)試按鈕事件</TITLE>
</HEAD>
<BODY>
<FORM NAME="Form1">
   <INPUT TYPE="Button" NAME="Button1" VALUE="單擊">
   <SCRIPT FOR="Button1" EVENT="onClick" LANGUAGE="VBScript">
      MsgBox "按鈕被單擊!"
   </SCRIPT>
</FORM>
</BODY>
</HTML>

該程序運(yùn)行后的界面如圖2.1(a)所示,單擊其中的按鈕,出現(xiàn)圖2.1(b)的畫面。
            
(a) 運(yùn)行后的效果圖                      (b) 單擊按鈕后效果
圖2.1  例程運(yùn)行效果圖
大多數(shù)Script代碼在Sub或Function過程中,僅在其他代碼要調(diào)用它時(shí)執(zhí)行。然而,我們也可以將VBScript代碼放在過程之外、SCRIPT塊之中,這類代碼僅在HTML頁面加載時(shí)執(zhí)行一次。這樣就可以在加載Web頁面時(shí)初始化數(shù)據(jù)或動(dòng)態(tài)地改變頁面的外觀。
2.2  VBScript數(shù)據(jù)類型
雖然Visual Basic中有許多種數(shù)據(jù)類型,但是在VBScript中,只支持一種數(shù)據(jù)類型,即Variant。Variant是一種很特殊的數(shù)據(jù)類型,根據(jù)它使用方式的不同,可以代表各種數(shù)據(jù)類型。如果我們將一個(gè)變量賦值為數(shù)字,那么在引用這個(gè)變量的時(shí)候,它將作為數(shù)字使用;如果我們將一個(gè)變量賦值為字符串,那么我們可以對(duì)這個(gè)變量進(jìn)行字符串的各種操作。在實(shí)際使用的過程中,VBScript可以根據(jù)在變量中存儲(chǔ)的數(shù)據(jù)識(shí)別其類型。有關(guān)變量的概念和變量的賦值操作,我們隨后講解。
在VBScript識(shí)別的過程中,除了數(shù)字和字符串之外,還包括了布爾類型、時(shí)間類型、貨幣類型等等,我們將其稱為子類型(Subtypes)。在表2.1中,列舉了VBScript中的數(shù)據(jù)子類型:
表2.1  VBScript中數(shù)據(jù)子類型
類型      說明
Empty      空類型,代表未初始化的Variant變量值,如果變量是數(shù)字,那么它為0,如果變量是字符串,那么它為長(zhǎng)度為0的字符串
Null      無效類型,這說明在變量中保存的是無效的數(shù)據(jù)
Boolean      布爾類型,取值為True或者False
Byte      字節(jié)類型,取值范圍是從0到255的整數(shù)
Integer      整數(shù)類型,取值范圍是從-32768到32767的整數(shù)
Currency      貨幣類型,取值范圍從-922,337,203,685,477.5808到922,337,203,685,447.5807
Long      長(zhǎng)整數(shù)類型,取值范圍是從-2,147,483,648到2,147,483,647的整數(shù)
Single      單精度浮點(diǎn)類型,負(fù)數(shù)取值范圍從-3.402823E38到-1.401298E-45,正數(shù)取值范圍從1.401298E-45到3.402823E38
Double      雙精度浮點(diǎn)類型,負(fù)數(shù)取值范圍從-1.7779769312386232E308到-4.94065645841247E-324,正數(shù)取值范圍從4.94065645841247E-324到1.7779769312386232E308
Date(Time)      日期類型,可以代表從100年1月1日到9999年12月31日的日期
String      字符串類型,字符串的長(zhǎng)度是可變的,最長(zhǎng)可達(dá)20億個(gè)字符
Object      對(duì)象類型
Error      錯(cuò)誤編號(hào)類型

無效類型對(duì)許多人來說,也許是比較難以理解的一種類型,它不象前面幾種類型那樣直觀,無效類型的數(shù)據(jù)就是Null。
表2.2  VarType函數(shù)獲取各種數(shù)據(jù)子類型變量的返回值
數(shù)據(jù)子類型      返回值
Empty      0
Null      1
Integer      2
Long      3
Single      4
Double      5
Currency      6
Date(Time)      7
String      8
Object      9
Error      10
Boolean      11
Variant      12
DataObject      13
Byte      17
Array      8192

例如,我們可以把Null賦值給變量theNull,其語句如下所示:
theNull = Null
一定不要把無效類型和數(shù)字類型中的0或者字符串類型中的空字符串混淆起來,Null意味著什么都沒有,代表的是變量中并沒有存儲(chǔ)著有效的數(shù)據(jù),而0代表的是一個(gè)數(shù)值,空字符串代表的是字符串長(zhǎng)度為0,這兩個(gè)值都是有效的。雖然無效類型有些令人難以理解,但在深入VBScript編程的過程中,也許你會(huì)慢慢發(fā)現(xiàn),無效類型也是十分有用的一種數(shù)據(jù)類型。
我們?nèi)绻枰榭醋兞康臄?shù)據(jù)子類型,我們可以使用VarType函數(shù)獲取。例如,如果我們定義了一個(gè)變量k,并且將其賦值為3,那么我們可以使用以下語句獲取其類型:
VarType(k)
執(zhí)行這個(gè)函數(shù)之后將會(huì)返回2,代表這個(gè)變量的子類型是整數(shù)類型,在表2.2中我們列舉了使用VarType函數(shù)獲取的各種數(shù)據(jù)子類型變量的返回值。

dyle_gg,2004-12-02 14:13:19

2.3  VBScript變量
使用腳本語言時(shí),變量是其中最基本的元素,腳本執(zhí)行過程中,往往需要用一個(gè)單元將信息存儲(chǔ)起來,變量就是這樣的一個(gè)命名的存儲(chǔ)單元,存儲(chǔ)在這個(gè)單元中的數(shù)據(jù)就是變量的值。例如,我們可以創(chuàng)建一個(gè)名稱為Visitors的變量將訪問站點(diǎn)的人數(shù)記錄下來,這個(gè)變量的值是存儲(chǔ)在計(jì)算機(jī)的內(nèi)存中,但在使用的過程中,我們并不需要知道它的內(nèi)存地址,只要通過Visitors,我們就可以直接獲取該變量的值或者修改這個(gè)值。
后面我們還講到常量的概念,雖然說常量和變量一樣可以賦予數(shù)值,但是常量和變量有所不同,變量可以反復(fù)賦值,而常量的數(shù)值一旦確定下來之后就不能發(fā)生變化了。
使用變量時(shí),一般要先聲明變量,而命名變量時(shí)也要按照VBScript的命名要求才能正確命名變量。
2.3.1  聲明變量
VBScript和Visual Basic一樣,在使用變量前并可以不對(duì)變量聲明,在例2.1中,我們用到了一個(gè)變量Message,但是我們并沒有預(yù)先對(duì)它進(jìn)行聲明,這并不影響腳本的執(zhí)行。

<HTML>
<HEAD>
<TITLE> Use variable without declare </TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
   Message = “hello”
   window.document.write(Message)
-->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>
例2.1  在腳本中未聲明而使用一個(gè)變量
在這個(gè)頁面中,執(zhí)行的結(jié)果是在頁面上顯示字符串hello。在VBScript中,不聲明而直接使用變量,我們稱為對(duì)這是對(duì)變量的隱式聲明。
2.3.1.1  Option Explicit
Optioin Explicit語句強(qiáng)制要求顯式聲明腳本中使用的所有變量,在使用這條語句之后,必須使用Dim、Private、Public或者ReDim語句聲明所有變量。不過Option Explicit語句在頁面中的位置很特殊,它必須放置于所有HTML文本和腳本命令之前,也就是說它必須作為ASP頁面的起始語句之一。其語法如下所示:
Option Explicit
如果將這句腳本加入到例2.1中,那么在運(yùn)行的過程中將會(huì)出現(xiàn)如下錯(cuò)誤:
Microsoft VBScript 運(yùn)行時(shí)錯(cuò)誤 error ‘800a01f4’
變量未定義: ‘Message’
/message.asp, line 7
隱式聲明變量并不是一個(gè)良好的編程習(xí)慣。因?yàn)樵诰帉懩_本的過程中,我們很有可能出現(xiàn)因?yàn)槠磳懯韬龆鴮?dǎo)致腳本執(zhí)行出現(xiàn)意外錯(cuò)誤,并且這種錯(cuò)誤是難以被發(fā)現(xiàn)和改正的,例如,如果我們?cè)陂_始對(duì)變量Message賦值,但是在后面腳本程序中,由于疏忽,我們將變量拼寫成為Messag,在不要求變量顯式聲明的情況下,腳本執(zhí)行將不會(huì)產(chǎn)生錯(cuò)誤,Message和Messag會(huì)被視為兩個(gè)不同的變量,然而結(jié)果明顯和我們預(yù)期不符,這種錯(cuò)誤是很難發(fā)現(xiàn)的。我們建議在腳本時(shí)使用Option Explicit語句,要求變量顯式聲明,這是一種良好的編程習(xí)慣。
2.3.1.2  Dim
在聲明變量的時(shí)候,我們一般使用Dim語句,其語法如下所示:
Dim varname[([subscripts])]
其中,varname是變量的名稱,在聲明數(shù)組的時(shí)候,subscripts代表的是數(shù)組的上界。
我們?cè)赩BScript中聲明變量時(shí),不需要指定變量的數(shù)據(jù)類型,這是由于VBScript中,所有變量都是相同的數(shù)據(jù)類型,都是Variant類型變量,這是一種特殊的數(shù)據(jù)類型,它代表了Visual Basic中其他所有的數(shù)據(jù)類型。Variant類型可以根據(jù)存儲(chǔ)在其中的信息自動(dòng)識(shí)別實(shí)際數(shù)據(jù)類型。
例如,下面的聲明中,我們聲明了變量Message:
Dim Message
除了變量之外,我們還可以聲明數(shù)組。在聲明數(shù)組的時(shí)候,變量名后面帶有括號(hào),下面的語句中,我們聲明了一個(gè)數(shù)組,名稱為Items:
Dim Items(10)
對(duì)于這個(gè)數(shù)組,數(shù)組的上界是10,而下界總是默認(rèn)為0,所以,數(shù)組中的元素是11個(gè)。在使用數(shù)組的時(shí)候,我們可以通過數(shù)組的下標(biāo)引用數(shù)組,例如:
SomeData = Item(3)
在聲明數(shù)組的時(shí)候,我們也可以不局限于一維數(shù)組,VBScript支持?jǐn)?shù)組最大的維數(shù)是60。聲明多維數(shù)組時(shí)需要用逗號(hào)分隔代表數(shù)組上界的數(shù)組,在下面的聲明中,ItemTable是一個(gè)4行5列的二維數(shù)組:
Dim ItemTable(3, 4)
2.3.1.3  ReDim
使用ReDim語句,我們可以管理動(dòng)態(tài)數(shù)組,上面我們聲明數(shù)組的時(shí)候直接指定了數(shù)組的大小,這種類型的數(shù)組就是靜態(tài)數(shù)組;動(dòng)態(tài)數(shù)組和靜態(tài)數(shù)組不同之處在于,動(dòng)態(tài)數(shù)組的大小可以在腳本執(zhí)行的過程中發(fā)生變化。
在聲明動(dòng)態(tài)數(shù)組的時(shí)候,我們需要首先使用Dim語句或者ReDim語句對(duì)數(shù)組進(jìn)行聲明,但不要指定數(shù)組的上界,也就是說,在數(shù)組聲明的括號(hào)中不包含任何數(shù)字,例如:
Dim Visitors()
然后,再使用ReDim語句設(shè)置數(shù)組的大小,例如,在下面的聲明中,我們將Visitors數(shù)組的上界設(shè)定為10:
ReDim Visitors(10)
在使用ReDim語句的過程中,我們還可以使用Preserve關(guān)鍵字,當(dāng)使用Preserver關(guān)鍵字調(diào)整數(shù)組大小的時(shí)候,將會(huì)保留數(shù)組中的內(nèi)容,例如,假設(shè)我們先將Visitors數(shù)組上界設(shè)定為10,然后我們?cè)偈褂肞reserve關(guān)鍵字將上界修改為20:
ReDim Preserve Visitors(20)
這樣,在調(diào)整數(shù)組大小的過程中,數(shù)組中前11個(gè)元素還會(huì)保留。
注意:對(duì)于動(dòng)態(tài)數(shù)組而言,調(diào)整數(shù)組大小的次數(shù)是沒有限制的,但是,如果我們使數(shù)組的大小變小,那么數(shù)組中被刪除元素的數(shù)據(jù)會(huì)丟失。
2.3.1.4  Public
使用Dim語句可以在腳本的過程中聲明的變量,也可以在過程外聲明變量,在過程中聲明的變量稱為過程級(jí)變量(Procedure level),在過程外聲明的變量稱為腳本級(jí)變量(Script level),過程級(jí)變量只能應(yīng)用于過程中,腳本級(jí)變量可以應(yīng)用于腳本中所有的過程。關(guān)于過程,我們會(huì)在后面的章節(jié)中進(jìn)行詳細(xì)討論。
Public語句不能用于聲明過程級(jí)變量,只能聲明腳本級(jí)變量,運(yùn)用Public聲明的變量聲明的變量可以運(yùn)用于腳本的所有過程中。其語法如下所示:
Public varname[([subscripts])]
其中,varname代表的是變量名稱,subscripts代表的是數(shù)組的上界。和Dim語句一樣,Public語句也能夠聲明動(dòng)態(tài)數(shù)組和靜態(tài)數(shù)組,以及多維數(shù)組。
2.3.1.5  Private
Private語句和Public語句是相對(duì)的,Private語句也只能聲明腳本級(jí)變量,運(yùn)用Private語句聲明的變量只能在聲明該變量的腳本中使用。其語法如下所示:
Private varname[([subscripts])]
其中,varname代表的是變量名稱,subscripts代表的是數(shù)組的上界。和Dim語句一樣,Private語句也能夠聲明動(dòng)態(tài)數(shù)組和靜態(tài)數(shù)組,以及多維數(shù)組。
2.3.2  變量的命名規(guī)則
在變量命名的過程中,必須遵循以下幾條規(guī)則:
1. 變量名稱的第一個(gè)字符必須是字母,例如,BookName是合法的變量名稱,而諸如_bookname、3bookname這些變量名稱都是非法變量名稱。
2. 不能包含嵌入的句號(hào)(.),例如,Book.Name就是非法的變量名稱。
3. 變量名稱的長(zhǎng)度必須少于255個(gè)字符。
4. 在變量的作用域中,變量的名稱要求唯一。變量的作用域是有聲明變量的位置所決決定的,如果是在過程中聲明變量,那么變量的作用域是整個(gè)過程;如果是在過程外聲明變量,那么變量的作用域是整個(gè)腳本。這也就是說,如果具有相同名稱的兩個(gè)或者多個(gè)變量具有相同的作用域,那么將會(huì)出錯(cuò)。不過在兩個(gè)過程中,我們可以將變量命名為相同的名稱,例如,如果在兩個(gè)過程中,我們都需要用到臨時(shí)變量,那可以將這兩個(gè)臨時(shí)變量都命名為temp。
在一般情況下,我們?cè)诮o變量命名時(shí),希望能夠使用有意義的變量名稱,如果需要使用一個(gè)變量表示一本書的價(jià)格,雖然命名為j或book都沒有什么錯(cuò)誤,但若能命名為bookPrice會(huì)使得腳本有更好可讀性,也可以方便腳本開發(fā)人員進(jìn)行腳本的編寫和調(diào)試工作。
這是我們對(duì)于變量命名的約定,并不是強(qiáng)制性要求,用戶完全可以不按照我們的約定來做(只要不違反VBScript對(duì)于變量命名的要求就可以了),但養(yǎng)成良好的編程風(fēng)格對(duì)于ASP頁面開發(fā)人員來說,還是很有意義的。
2.3.3  給變量賦值
創(chuàng)建如下形式的表達(dá)式給變量賦值:變量在表達(dá)式左邊,要賦的值在表達(dá)式右邊。例如:
MyVariable=200
2.3.4  標(biāo)量變量和數(shù)組變量
多數(shù)情況下,只需為聲明的變量賦一個(gè)值。只包含一個(gè)值的變量被稱為標(biāo)量變量。有時(shí)候,將多個(gè)相關(guān)值賦給一個(gè)變量更為方便,因此可以創(chuàng)建包含一系列值的變量,稱為數(shù)組變量。數(shù)組變量和標(biāo)量變量是以相同的方式聲明的,唯一的區(qū)別是聲明數(shù)組變量時(shí)變量名后面帶有括號(hào)( )。下例聲明了一個(gè)包含11個(gè)元素的一維數(shù)組:
Dim A(10)
雖然括號(hào)中顯示的數(shù)字是10,但由于在VBScript中所有數(shù)組都是基于0的,所以這個(gè)數(shù)組實(shí)際上包含11個(gè)元素。在基于0的數(shù)組中,數(shù)組元素的數(shù)目總是括號(hào)中顯示的數(shù)目加1。這種數(shù)組被稱為固定大小的數(shù)組。
在數(shù)組中使用索引為數(shù)組的每個(gè)元素賦值。從0到10,將數(shù)據(jù)賦給數(shù)組的元素,如下所示:
A(0) = 256
A(1) = 324
A(2) = 100

A(10) = 55
與此類似,使用索引可以檢索到所需的數(shù)組元素的數(shù)據(jù)。例如:

SomeVariable = A(8)  

數(shù)組并不僅限于一維。數(shù)組的維數(shù)最大可以為60(盡管大多數(shù)人不能理解超過3或4的維數(shù))。聲明多維數(shù)組時(shí)用逗號(hào)分隔括號(hào)中每個(gè)表示數(shù)組大小的數(shù)字。在下例中,MyTable變量是一個(gè)有6行和11列的二維數(shù)組:
Dim MyTable(5, 10)
在二維數(shù)組中,括號(hào)中第一個(gè)數(shù)字表示行的數(shù)目,第二個(gè)數(shù)字表示列的數(shù)目。
也可以聲明動(dòng)態(tài)數(shù)組,即在運(yùn)行Script時(shí)大小發(fā)生變化的數(shù)組。對(duì)數(shù)組的最初聲明使用Dim語句或ReDim語句。但是對(duì)于動(dòng)態(tài)數(shù)組,括號(hào)中不包含任何數(shù)字。例如:
Dim MyArray()
ReDim AnotherArray()
要使用動(dòng)態(tài)數(shù)組,必須隨后使用ReDim確定維數(shù)和每一維的大小。在下例中,ReDim將動(dòng)態(tài)數(shù)組的初始大小設(shè)置為25,而后面的ReDim語句將數(shù)組的大小重新調(diào)整為30,同時(shí)使用Preserve關(guān)鍵字在重新調(diào)整大小時(shí)保留數(shù)組的內(nèi)容。
ReDim MyArray(25)

ReDim Preserve MyArray(30)
重新調(diào)整動(dòng)態(tài)數(shù)組大小的次數(shù)是沒有任何限制的,但是應(yīng)注意:將數(shù)組的大小調(diào)小時(shí),將會(huì)丟失被刪除元素的數(shù)據(jù)。
2.4  VBScript常量
常量是具有一定含義的名稱,用于代替數(shù)字或字符串,其值從不改變。此外,VBScript還定義了許多固有常量,這無疑大大方便了程序員的開發(fā)工作。
2.4.1  聲明自定義常量
在VBScript中,我們可以聲明常量,用來代替數(shù)字、日期或者字符串等數(shù)值,常量的數(shù)值在腳本運(yùn)行的過程中不能發(fā)生變化。常量聲明的語法如下所示:
Const constname = expression
其中,constname是常量的名稱,expression是常量的值。
對(duì)于腳本開發(fā)人員來說,常量是很有用的,例如,如果在我們的腳本中需要使用到π,我們往往會(huì)將其定義為一個(gè)常量,賦值為3.14:
Const PI = 3.14
如果需要更高的精度,那么,我們可以將其設(shè)置為3.1415927:
Const PI = 3.1415927
在使用常量的情況下,我們只需要修改常量聲明這一條語句就可以了,若我們不使用常量,那么我們則不得不將頁面中用到π的地方全部進(jìn)行修改。在使用常量的情況下,將會(huì)提高腳本的可讀性與易維護(hù)性。
在常量聲明的前面,我們也可以加上Public和Private前綴來設(shè)置其作用域,設(shè)置方式和變量是一樣的。缺省情況下,在過程中聲明的常量具有過程級(jí)作用域,在過程外聲明的常量具有腳本級(jí)作用域。
在常量命名的過程中,也需要遵循變量的命名規(guī)則,并且不能和變量名稱、VBScript內(nèi)部函數(shù)名稱和用戶自定義函數(shù)名稱相同。而且,在聲明的時(shí)候,變量的值必須是一個(gè)簡(jiǎn)單常量,而不能是帶有操作符的表達(dá)式。
我們建議在命名常量的時(shí)候,也使用一個(gè)命名方法,將常量和變量區(qū)分開來,這樣可以避免將常量和變量混淆,不至于在腳本中對(duì)常量重新賦值,我們可以將常量的所有字母大寫,例如,PI,或者使用“con”作為常量的前綴,例如,conPi。將常量和變量區(qū)分開是一個(gè)良好的編程風(fēng)格,避免在腳本開發(fā)中出現(xiàn)混亂。
使用Const語句創(chuàng)建名稱具有一定含義的字符串型常量時(shí),通常需要將字符串文字包含在兩個(gè)引號(hào)(" ")之間。例如:
Const MyString = "這是一個(gè)字符串。"
這也區(qū)分字符串型常量和數(shù)值型常量的最明顯的方法。另外,日期文字和時(shí)間文字應(yīng)當(dāng)包含在兩個(gè)井號(hào)(#)之間。例如:
Const CutoffDate = #6-1-97#
2.4.2  使用固有常量
剛剛提到,VBScript還定義了固有常量,設(shè)計(jì)人員可以在程序中定義并直接引用這些常量。VBScript定義的常量包括顏色常量、比較常量、日期和時(shí)間常量、日期格式常量、DriveType常量、FileAttributes常量、文件輸入/輸出常量、MsgBox常量、SpecialFolder常量、字符串常量、Tristate常量、VarType常量等。
例如,VBScript的顏色常量包括8個(gè)常量,各常量的名稱、值和描述見表2.1。為便函于編程人員參考,我們?cè)诒?.1中一并給出了VBScript其他固有常量的名稱、值和描述。
表2.1  VBScript的固有常量
顏色常數(shù)
常數(shù)      值      描述
vbBlack      &h00      黑色
vbRed      &hFF      紅色
vbGreen      &hFF00      綠色
vbYellow      &hFFFF      黃色
vbBlue      &hFF0000      藍(lán)色
vbMagenta      &hFF00FF      紫色
vbCyan      &hFFFF00      青色
vbWhite      &hFFFFFF      白色
比較常數(shù)
常數(shù)      值      描述
vbBinaryCompare      0      執(zhí)行二進(jìn)制比較。
vbTextCompare      1      執(zhí)行文本比較。
vbDatabaseCompare      2      基于數(shù)據(jù)庫所包含的信息,在數(shù)據(jù)庫中進(jìn)行比較。
日期和時(shí)間常數(shù)
常數(shù)      值      描述
vbSunday      1      星期日
vbMonday      2      星期一
vbTuesday      3      星期二
vbWednesday      4      星期三
vbThursday      5      星期四
vbFriday      6      星期五
vbSaturday      7      星期六
vbFirstJan1      1      使用包含1月1日的星期(默認(rèn))。
vbFirstFourDays      2      使用第一個(gè)至少包含新的年中四天的星期。
vbFirstFullWeek      3      使用某年的第一個(gè)整周。
vbUseSystem      0      使用計(jì)算機(jī)區(qū)域設(shè)置中的日期格式。
vbUseSystemDayOfWeek      0      由系統(tǒng)設(shè)置定義每周的第一天是星期幾。
日期格式常數(shù)
常數(shù)      值      描述
vbGeneralDate      0      顯示日期和/或時(shí)間。對(duì)于實(shí)數(shù),顯示日期和時(shí)間。如果沒有小數(shù)部分,僅顯示日期。如果沒有整數(shù)部分,則僅顯示時(shí)間。由系統(tǒng)設(shè)置決定日期和時(shí)間的顯示。
vbLongDate      1      按計(jì)算機(jī)中區(qū)域設(shè)置指定的長(zhǎng)日期格式顯示日期。
vbShortDate      2      按計(jì)算機(jī)中區(qū)域設(shè)置指定的短日期格式顯示日期。
vbLongTime      3      按計(jì)算機(jī)中區(qū)域設(shè)置指定的長(zhǎng)時(shí)間格式顯示時(shí)間。
vbShortTime      4      按計(jì)算機(jī)中區(qū)域設(shè)置指定的短時(shí)間格式顯示時(shí)間。
DriveType常數(shù)
常數(shù)      值      描述
Unknown      0      無法確定驅(qū)動(dòng)器類型。
Removable      1      可移動(dòng)媒體驅(qū)動(dòng)器,包括軟盤驅(qū)動(dòng)器和其他多種存儲(chǔ)設(shè)備。
Fixed      2      固定(不可移動(dòng))媒體驅(qū)動(dòng)器,包括所有硬盤驅(qū)動(dòng)器(包括可移動(dòng)的硬盤驅(qū)動(dòng)器)。
Remote      3      網(wǎng)絡(luò)驅(qū)動(dòng)器,包括網(wǎng)絡(luò)上任何位置的共享驅(qū)動(dòng)器。
CDROM      4      CD-ROM驅(qū)動(dòng)器,不區(qū)分只讀和可讀寫的CD-ROM驅(qū)動(dòng)器。
RAMDisk      5      RAM磁盤,在本地計(jì)算機(jī)中占用一塊“隨機(jī)存取內(nèi)存”(RAM)虛擬為磁盤驅(qū)動(dòng)器。
FileAttributes常數(shù)
常數(shù)      值      描述
Normal      0      普通文件。未設(shè)置屬性。
ReadOnly      1      只讀文件。
Hidden      2      隱藏文件。
System      4      系統(tǒng)文件。
Volume      8      磁盤驅(qū)動(dòng)器卷標(biāo)。
Directory      16      文件夾或目錄。
Archive      32      上次備份后已更改的文件。
Alias      64      鏈接或快捷方式。
Compressed      128      壓縮文件。
文件輸入/輸出常數(shù)
常數(shù)      值      描述
ForReading      1      以只讀方式打開文件。不能向該文件寫入內(nèi)容。
ForWriting      2      以可讀寫方式打開文件。如果已存在同名的文件,則覆蓋舊的文件。
ForAppending      8      打開文件并在文件末尾寫入內(nèi)容。
MsgBox常數(shù)
常數(shù)      值      描述
vbOKOnly      0      只顯示確定按鈕。
vbOKCancel      1      顯示確定和取消按鈕。
vbAbortRetryIgnore      2      顯示終止、重試和忽略按鈕。
vbYesNoCancel      3      顯示是、否和取消按鈕。
vbYesNo      4      顯示是和否按鈕。
vbRetryCancel      5      顯示重試和取消按鈕。
vbCritical      16      顯示臨界消息圖標(biāo)。
vbQuestion      32      顯示警告詢問圖標(biāo)。
vbExclamation      48      顯示警告消息圖標(biāo)。
vbInformation      64      顯示提示消息圖標(biāo)。
vbDefaultButton1      0      第一個(gè)按鈕是默認(rèn)按鈕。
vbDefaultButton2      256      第二個(gè)按鈕是默認(rèn)按鈕。
vbDefaultButton3      512      第三個(gè)按鈕是默認(rèn)按鈕。
vbDefaultButton4      768      第四個(gè)按鈕是默認(rèn)按鈕。
vbApplicationModal      0      應(yīng)用程序模式。用戶必須響應(yīng)消息框,才能繼續(xù)在當(dāng)前應(yīng)用程序中工作。
vbSystemModal      4096      系統(tǒng)模式。用戶響應(yīng)消息框前,掛起所有應(yīng)用程序。
下列常數(shù)與MsgBox函數(shù)一起使用,標(biāo)識(shí)用戶選定的按鈕
常數(shù)      值      描述
vbOK      1      確定按鈕被單擊。
vbCancel      2      取消按鈕被單擊。
vbAbort      3      終止按鈕被單擊。
vbRetry      4      重試按鈕被單擊。
vbIgnore      5      忽略按鈕被單擊。
vbYes      6      是按鈕被單擊。
vbNo      7      否按鈕被單擊。
SpecialFolder常數(shù)
常數(shù)      值      描述
WindowsFolder      0      Windows文件夾,包含由Windows系統(tǒng)安裝的文件。
SystemFolder      1      System文件夾,包含庫、字體和設(shè)備驅(qū)動(dòng)程序文件。
TemporaryFolder      2      Temp文件夾,用于保存臨時(shí)文件??稍赥MP環(huán)境變量中找到該文件夾的路徑。
字符串常數(shù)
常數(shù)      值      描述
vbCr      Chr(13)      回車符
vbCrLf      Chr(13) & Chr(10)      回車符與換行符
vbFormFeed      Chr(12)      換頁符;在MicrosoftWindows中不適用
vbLf      Chr(10)      換行符
vbNewLine      Chr(13) & Chr(10)或Chr(10)      平臺(tái)指定的新行字符;適用于任何平臺(tái)
vbNullChar      Chr(0)      值為0的字符
vbNullString      值為0的字符串      與零長(zhǎng)度字符串("")不同;用于調(diào)用外部過程
vbTab      Chr(9)      水平附簽
vbVerticalTab      Chr(11)      垂直附簽;在MicrosoftWindows中不適用
Tristate常數(shù)
常數(shù)      值      描述
TristateTrue      -1      True
TristateFalse      0      False
TristateUseDefault      -2      使用默認(rèn)設(shè)置
VarType常數(shù)            
常數(shù)      值      描述
vbEmpty      0      未初始化(默認(rèn))
vbNull      1      不包含任何有效數(shù)據(jù)
vbInteger      2      整型子類型
vbLong      3      長(zhǎng)整型子類型
vbSingle      4      單精度子類型
vbDouble      5      雙精度子類型
vbCurrency      6      貨幣子類型
vbDate      7      日期子類型
vbString      8      字符串子類型
vbObject      9      對(duì)象
vbError      10      錯(cuò)誤子類型
vbBoolean      11      Boolean子類型
vbVariant      12      Variant(僅用于變量數(shù)組)
vbDataObject      13      數(shù)據(jù)訪問對(duì)象
vbDecimal      14      十進(jìn)制子類型
vbByte      17      字節(jié)子類型
vbArray      8192      數(shù)組
其他常數(shù)
常數(shù)      值      描述
vbObjectError      &h80040000      自定義錯(cuò)誤號(hào)應(yīng)大于該值,例如,Err.Raise Number = vbObjectError + 1000

2.5  VBScript的表達(dá)式與運(yùn)算符
在VBScript中,表達(dá)式可以將變量、常數(shù)、運(yùn)算符和關(guān)鍵字結(jié)合起來,用于執(zhí)行運(yùn)算、處理字符或者測(cè)試數(shù)據(jù),表達(dá)式運(yùn)算返回的結(jié)果可能是數(shù)字類型的數(shù)據(jù),也可能是字符串類型或者其他類型的數(shù)據(jù)。其實(shí),我們對(duì)于表達(dá)式應(yīng)該是十分熟悉的,例如,1+2就是一個(gè)簡(jiǎn)單的表達(dá)式。
在表達(dá)式運(yùn)算的過程中,表達(dá)式里操作一個(gè)或兩個(gè)變量、常量或者數(shù)據(jù)產(chǎn)生運(yùn)算結(jié)果的符號(hào)稱為運(yùn)算符,被運(yùn)算符操作的數(shù)據(jù)稱作操作數(shù),需要注意的是,操作數(shù)并不僅僅局限于數(shù)字和字符串等類型的數(shù)據(jù),它本身也可以是表達(dá)式。VBScript支持一套完整的運(yùn)算符,其中我們會(huì)用到算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和連接運(yùn)算符,下面我們就對(duì)這些操作符進(jìn)行簡(jiǎn)要的介紹。
2.5.1  算術(shù)運(yùn)算符
在VBScript中,算術(shù)運(yùn)算符用以完成數(shù)學(xué)運(yùn)算,一般情況下,算術(shù)運(yùn)算符的語法如下所示:
Result = Exp1 Operator Exp2
其中,Result是表達(dá)式運(yùn)算結(jié)果,Operator是算術(shù)運(yùn)算符,Exp1和Exp2則是表達(dá)式中的操作數(shù)。
VBScript中能夠使用的算術(shù)運(yùn)算符如表2.2所示,下面我們分別展開介紹:
表2.2  VBScript算術(shù)運(yùn)算符
運(yùn)算符      說明
+      加法運(yùn)算符,將兩個(gè)數(shù)相加
-      減法運(yùn)算符,將兩個(gè)數(shù)相減或者對(duì)一個(gè)數(shù)取負(fù)
*      乘法運(yùn)算符,將兩個(gè)數(shù)相乘
/      除法運(yùn)算符,將兩個(gè)數(shù)相除
\      整除運(yùn)算符,將兩個(gè)數(shù)進(jìn)行整除運(yùn)算
^      冪運(yùn)算符,將兩個(gè)數(shù)進(jìn)行冪運(yùn)算
Mod      模運(yùn)算符,將兩個(gè)數(shù)整除后進(jìn)行取模操作

2.5.1.1  加法運(yùn)算符(+)
加法運(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è)字符串連接起來作為運(yùn)算結(jié)果。例如,"How are "+"you!"的運(yùn)算結(jié)果為"How are you!"。雖然加法運(yùn)算符完全可以進(jìn)行字符串連接,不過,我們并不建議這樣使用,因?yàn)槿菀滓鸹煜?,在字符串連接的時(shí)候,我們建議采用字符串連接的符號(hào)——&。
在加法運(yùn)算的過程中,如果兩個(gè)操作數(shù)都是數(shù)字類型,那么將進(jìn)行加法操作:3+4的結(jié)果是7;如果兩個(gè)操作數(shù)都是字符串類型,那么將進(jìn)行字符串連接操作:“3”+“4”的結(jié)果是“34”;如果一個(gè)操作數(shù)是數(shù)字,另外一個(gè)操作數(shù)是字符串,那么會(huì)將字符串轉(zhuǎn)化為數(shù)字之后進(jìn)行加法操作:3+“4”的結(jié)果是7。
2.5.1.2  減法運(yùn)算符(-)
減法運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的減法運(yùn)算,例如表達(dá)式2-1的運(yùn)算結(jié)果為1。
同時(shí),減法運(yùn)算符還是一個(gè)取負(fù)運(yùn)算符,當(dāng)它作為取負(fù)運(yùn)算符的時(shí)候,它只有一個(gè)操作數(shù),取負(fù)運(yùn)算符的功能是返回操作數(shù)的相反數(shù)。例如如果變量i的值為2,那么-i這個(gè)表達(dá)式的值為-2。
2.5.1.3  乘法運(yùn)算符(*)
乘法運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的乘法運(yùn)算,例如表達(dá)式2*3的運(yùn)算結(jié)果為6。
2.5.1.4  除法運(yùn)算符(/)
除法運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的除法運(yùn)算,但VBScript中的除法運(yùn)算有些特別,在VBScript中,除法運(yùn)算后的結(jié)果是一個(gè)浮點(diǎn)數(shù),而不象C語言或者Java語言那樣在整數(shù)進(jìn)行除法運(yùn)算時(shí)將運(yùn)算結(jié)果強(qiáng)行轉(zhuǎn)化整數(shù),在VBScript中,1/2=0.5,而在C語言中,1/2=0。
2.5.1.5  整除運(yùn)算符(\)
整除運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的整除運(yùn)算,將兩個(gè)操作數(shù)相除后返回結(jié)果的整數(shù)部分,例如表達(dá)式5\2的運(yùn)算結(jié)果為2。不過在VBScript中,整除運(yùn)算符并不局限于整數(shù),如果操作數(shù)是浮點(diǎn)數(shù),VBScript會(huì)先將其四舍五入轉(zhuǎn)化為整數(shù)之后,然后再進(jìn)行整除運(yùn)算。例如5.4\1.5=2,而5.5\1.5=3。
2.5.1.6  冪運(yùn)算符(^)
冪運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的冪運(yùn)算,可以用于計(jì)算第一個(gè)操作數(shù)的指數(shù)次方,例如,表達(dá)式3^2的運(yùn)算結(jié)果為9。在冪運(yùn)算中,指數(shù)還可以是小數(shù),例如,3^0.5= 1.73205080756888,不過必須在第一個(gè)操作數(shù)為非負(fù)數(shù)字的時(shí)候,指數(shù)才能夠是小數(shù),因?yàn)樵赩BScript的運(yùn)算中,并不支持復(fù)數(shù)運(yùn)算。例如,如果表達(dá)式是(-3)^0.5,那么將會(huì)出現(xiàn)錯(cuò)誤。
2.5.1.7  模運(yùn)算符(Mod)
模運(yùn)算符對(duì)應(yīng)著數(shù)學(xué)運(yùn)算中的取模運(yùn)算,將兩個(gè)操作數(shù)進(jìn)行整除操作之后返回其余數(shù),例如,表達(dá)式5 Mod 2的運(yùn)算結(jié)果為1。和整除運(yùn)算符一樣的是,進(jìn)行取模運(yùn)算的時(shí)候,VBScript也會(huì)先將兩個(gè)操作數(shù)四舍五入之后,然后再取模。例如,5.4 Mod 1.5=1,而5.5 Mod 1.5=0。
模運(yùn)算符主要用于判斷一個(gè)數(shù)字是否能被另外一個(gè)數(shù)字整除,例如,如果我們希望知道某個(gè)年份是否是閏年,我們可以采用如下判斷方法:如果這個(gè)年份能夠被4整除,并且不能被100整除,那么,這個(gè)年份是閏年,另外,如果這個(gè)年份能夠被400整除,那么這個(gè)年份也是閏年。假設(shè)年份變量的名稱為theYear,那么判斷是否為閏年的表達(dá)式如下所示:
((theYear Mod 4 = 0) And (theYear Mod 100 <> 0)) Or (theYear Mod 400 = 0)
其中And代表的是邏輯運(yùn)算中的與運(yùn)算,Or代表的是邏輯運(yùn)算中的或運(yùn)算,關(guān)于邏輯運(yùn)算,我們會(huì)在以后部分中進(jìn)行介紹。

dyle_gg,2004-12-02 14:13:51

2.5.2  關(guān)系運(yùn)算符
關(guān)系運(yùn)算符將兩個(gè)操作數(shù)進(jìn)行比較,判斷其關(guān)系,然后返回一個(gè)邏輯值,表明這個(gè)比較操作的結(jié)果是真還是假。其語法形式如下所示:
Result = Exp1 Operator Exp2
其中Result是表達(dá)式的判斷結(jié)果,結(jié)果可能是True、False或者Null,Operator是關(guān)系運(yùn)算符,Exp1和Exp2則是表達(dá)式中的操作數(shù)。在使用的時(shí)候,我們會(huì)發(fā)現(xiàn),如果判斷結(jié)果為True,那么返回的是-1,如果判斷結(jié)果為False,那么返回的是0,如果判斷結(jié)果為Null,那么什么也不返回。
VBScript支持的關(guān)系運(yùn)算符如表2.3所示:
表2.3  VBScript關(guān)系運(yùn)算符
運(yùn)算符      說明
=      等于關(guān)系,判斷兩個(gè)操作數(shù)是否相等
<>      不等于關(guān)系,判斷兩個(gè)操作數(shù)是否不相等
>      大于關(guān)系,判斷前一個(gè)操作數(shù)是否大于后一個(gè)操作數(shù)
<      小于關(guān)系,判斷前一個(gè)操作數(shù)是否小于后一個(gè)操作數(shù)
>=      大于等于關(guān)系,判斷前一個(gè)操作數(shù)是否大于等于后一個(gè)操作數(shù)
<=      小于等于關(guān)系,判斷前一個(gè)操作數(shù)是否小于等于后一個(gè)操作數(shù)
IS      對(duì)象關(guān)系,用來比較對(duì)象類型

注意:如果關(guān)系運(yùn)算中的任何一個(gè)操作數(shù)為Null,那么表達(dá)式返回的結(jié)果既不為True,也不為False,而是Null。
在關(guān)系運(yùn)算中,如果兩個(gè)操作數(shù)都是數(shù)值,那么將進(jìn)行數(shù)值比較。如果兩個(gè)操作數(shù)都是字符串,那么將進(jìn)行字符串比較。如果一個(gè)操作數(shù)是數(shù)值,另外一個(gè)操作數(shù)是字符串,VBScript則假定任何數(shù)值都比字符串要小。
2.5.2.1  等于關(guān)系(=)
等于關(guān)系比較兩個(gè)操作數(shù)是否相等,如果兩個(gè)操作數(shù)相等,返回True,否則返回False。例如,3=3.0的返回結(jié)果為True,3=4的返回結(jié)果為False,
2.5.2.2  不等于關(guān)系(<>)
不等于關(guān)系比較兩個(gè)操作數(shù)是否不相等,如果兩個(gè)操作數(shù)不等,返回True,否則返回False。如果操作數(shù)相同,等于關(guān)系和不等于關(guān)系判斷的結(jié)果完全相反。例如,3<>3.0的返回結(jié)果為False,3<>4的返回結(jié)果為True。
2.5.2.3  大于關(guān)系(>)
如果左操作數(shù)大于右操作數(shù),返回True,否則返回False。例如,3>2的返回結(jié)果為True,而3>3的返回結(jié)果為False。
2.5.2.4  小于關(guān)系(<)
如果左操作數(shù)小于右操作數(shù),返回True,否則返回False。例如,3<4的返回結(jié)果為True,3<3的返回結(jié)果為False。
2.5.2.5  大于等于關(guān)系(>=)
如果左操作數(shù)大于等于右操作數(shù),返回True,否則返回False。在兩個(gè)操作數(shù)完全相同的情況下,大于等于關(guān)系和小于關(guān)系的返回結(jié)果完全相反。例如,3>=4的返回結(jié)果為False,3>=3的返回結(jié)果為True。
2.5.2.6  小于等于關(guān)系(<=)
如果左操作數(shù)小于等于右操作數(shù),返回True,否則返回False。在兩個(gè)操作數(shù)完全相同的情況下,小于等于關(guān)系和大于關(guān)系的返回結(jié)果完全相反。例如,3<=2的返回結(jié)果為False,3<=3的返回結(jié)果為True。
2.5.2.7  對(duì)象關(guān)系(IS)
對(duì)象關(guān)系用于比較兩個(gè)變量引用的對(duì)象,如果兩個(gè)對(duì)象引用同一個(gè)變量,那么返回True,否則返回False。對(duì)象關(guān)系只能比較對(duì)象類型,而不能比較其他類型。例如,請(qǐng)看下面的語句:
Set ObjA = ObjB
在這個(gè)語句中,執(zhí)行的結(jié)果是使得ObjA引用ObjB所引用的同一個(gè)對(duì)象,在這種情況下,ObjA IS ObjB的返回結(jié)果為True。
2.5.2.8  字符串類型的比較
在關(guān)系運(yùn)算中,如果兩個(gè)操作數(shù)都是字符串,那么將進(jìn)行字符串類型的比較。在比較字符串的過程中,VBScript把字符串中的每個(gè)字母轉(zhuǎn)換成相應(yīng)的ASCII碼值,然后從第一個(gè)字符開始比較兩個(gè)字符串中相應(yīng)的字符,比較它們的ASCII碼值。例如, “hello”=“Hello”的返回結(jié)果為False,因?yàn)樽蟛僮鲾?shù)的第一個(gè)字符為h,右操作數(shù)的第一個(gè)字符為H,h的ASCII碼值為104,H的ASCII碼值為72,從第一個(gè)字符開始就不相等了,所以表達(dá)式的值為False。
如果有兩個(gè)表達(dá)式:“hello”>“Hello”和“hello”>=“Hello”,返回結(jié)果都為True,因?yàn)樽蟛僮鲾?shù)第一個(gè)字符的ASCII碼值為104,而右操作數(shù)的第一個(gè)字符的ASCII碼值為72,104>72(當(dāng)然同樣104>=72),所以兩個(gè)表達(dá)式的值都為True。
而如果表達(dá)式為“came”>=“come”,首先,比較兩個(gè)操作數(shù)的第一個(gè)字符,都是c,這樣,不能直接判定兩個(gè)操作數(shù)的大小,然后再比較兩個(gè)操作數(shù)的第二個(gè)字符,左操作數(shù)為a,右操作數(shù)為o,a的ASCII碼值為97,o的ASCII碼值為111,當(dāng)然97<111,所以對(duì)于這個(gè)表達(dá)式來說,它的返回結(jié)果為False。
字符串類型的比較情況下,我們用得最多的是判斷某個(gè)字符串類型的變量是否為空串,假設(shè)我們判斷變量的名稱為theString,那么對(duì)于theString=“”這個(gè)表達(dá)式來說,如果theString為空串,則表達(dá)式為True,否則為False。
2.5.3  邏輯運(yùn)算符
邏輯運(yùn)算符可以把布爾類型的表達(dá)式組合起來,完成邏輯運(yùn)算操作,然后返回其結(jié)果——真或假,這樣就可以完成比較復(fù)雜的邏輯判斷工作,一般情況下,邏輯運(yùn)算符的語法如下所示:
Result = Exp1 Operator Exp2
其中,Result是表達(dá)式運(yùn)算結(jié)果,Operator是邏輯運(yùn)算符,Exp1和Exp2則是表達(dá)式中的操作數(shù)。而對(duì)于邏輯運(yùn)算符中的非運(yùn)算符(Not),則只有一個(gè)操作數(shù)。
在VBScript中,邏輯運(yùn)算符十分豐富,如表2.4所示:
表2.4  VBScript邏輯運(yùn)算符
運(yùn)算符      說明
And      與運(yùn)算符,執(zhí)行邏輯與運(yùn)算
Or      或運(yùn)算符,執(zhí)行邏輯或運(yùn)算
Not      非運(yùn)算符,執(zhí)行邏輯非運(yùn)算
Xor      異或運(yùn)算符,執(zhí)行邏輯異或運(yùn)算
Eqv      等價(jià)運(yùn)算符,執(zhí)行邏輯等價(jià)運(yùn)算
Imp      蘊(yùn)涵運(yùn)算符,執(zhí)行邏輯蘊(yùn)涵運(yùn)算

2.5.3.1  與運(yùn)算符(And)
在執(zhí)行邏輯與運(yùn)算的過程中,只有當(dāng)兩個(gè)操作數(shù)均為True的時(shí)候,返回結(jié)果才為True,如果有一個(gè)操作數(shù)為False,則返回結(jié)果為False。不過和一般的邏輯操作不同,在VBScript中,還有可能操作數(shù)為Null,在表2.5中列舉了邏輯與運(yùn)算的條件和結(jié)果:
表2.5  邏輯與運(yùn)算的條件和結(jié)果
左操作數(shù)      右操作數(shù)      邏輯運(yùn)算結(jié)果
True      True      True
True      False      False
False      True      False
False      False      False
True      Null      Null
Null      True      Null
False      Null      False
Null      False      False
Null      Null      Null

例如,表達(dá)式 (3>2) And (3<4)的結(jié)果為True,表達(dá)式(3>2) And (3>4)的結(jié)果為False,而表達(dá)式(3>2) And Null的結(jié)果為Null,表達(dá)式(3>4) And Null的結(jié)果為False。
與運(yùn)算符還可以對(duì)數(shù)值進(jìn)行運(yùn)算操作,如果兩個(gè)操作數(shù)是數(shù)值的話,那么VBScript先將其轉(zhuǎn)化為二進(jìn)制,再?gòu)淖畹臀婚_始,按位進(jìn)行與運(yùn)算,最后再將運(yùn)算的結(jié)果以十進(jìn)制的形式返回。運(yùn)算的時(shí)候遵循以下規(guī)則:只有1 And 1的結(jié)果為1,否則,結(jié)果均為0。例如,4 And 3的結(jié)果是0,因?yàn)?的二進(jìn)制形式是100,而3的二進(jìn)制形式是011,按位與操作之后結(jié)果是000,所以返回結(jié)果是0。
2.5.3.2  或運(yùn)算符(Or)
在執(zhí)行邏輯或運(yùn)算的過程中,只有當(dāng)兩個(gè)操作數(shù)均為False的時(shí)候,返回結(jié)果才為False,如果有一個(gè)操作數(shù)為True,則返回結(jié)果為True。當(dāng)然,也存在操作數(shù)為Null的情況,在表2.6中列舉了邏輯或運(yùn)算的條件和結(jié)果:
表2.6  邏輯或運(yùn)算的條件和結(jié)果
左操作數(shù)      右操作數(shù)      邏輯運(yùn)算結(jié)果
True      True      True
True      False      True
False      True      True
False      False      False
True      Null      True
Null      True      True
False      Null      Null
Null      False      Null
Null      Null      Null

例如,表達(dá)式 (2>3) Or (3>4)的結(jié)果為False,表達(dá)式(2<3) Or (3>4)的結(jié)果為True,而表達(dá)式(3>4) Or Null的結(jié)果為Null,表達(dá)式(2<3) Or Null的結(jié)果為True。
當(dāng)或運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)于二進(jìn)制數(shù)的每一位進(jìn)行或運(yùn)算,運(yùn)算的時(shí)候遵循以下規(guī)則:只有0 Or 0的結(jié)果為0,其他情況下結(jié)果均為1。例如,4 Or 3的結(jié)果是7,因?yàn)?的二進(jìn)制形式是100,而3的二進(jìn)制形式是011,按位與操作之后結(jié)果是111,所以返回結(jié)果是7。
2.5.3.3  非運(yùn)算符(Not)
非運(yùn)算符只有一個(gè)操作數(shù),在執(zhí)行邏輯非運(yùn)算的過程中,如果操作數(shù)為True,返回結(jié)果False;如果操作數(shù)為False,返回結(jié)果為True;如果操作數(shù)為Null,則返回結(jié)果也為Null,如表2.7所示:
表2.7  邏輯非運(yùn)算的條件和結(jié)果
操作數(shù)      邏輯運(yùn)算結(jié)果
True      False
False      True
Null      Null

例如,表達(dá)式 Not (2>3)的結(jié)果為True,表達(dá)式Not (2<3)的結(jié)果為False,而如果變量theNull = Null,那么Not theNull的結(jié)果仍然是Null。
當(dāng)非運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)二進(jìn)制的每一位進(jìn)行非運(yùn)算:Not 0的結(jié)果是1,而Not 1的結(jié)果是0。例如,Not 4的結(jié)果是-5,在運(yùn)算的時(shí)候,4的二進(jìn)制形式是00000000 00000100,由于前面的0在與運(yùn)算、或運(yùn)算中均為0,不影響運(yùn)算結(jié)果,所以在前面的例子中,我們將這些0忽略了,而在進(jìn)行非運(yùn)算的時(shí)候,這些0必須保留,運(yùn)算結(jié)果的二進(jìn)制形式是11111111 11111011,十進(jìn)制形式是-5。
2.5.3.4  異或運(yùn)算符(Xor)
異或運(yùn)算符用于判斷兩個(gè)表達(dá)式的結(jié)果是否不同,在執(zhí)行邏輯異或運(yùn)算的過程中,如果兩個(gè)操作數(shù)同為True或同為False,返回結(jié)果為False,否則返回結(jié)果為True。如果有操作數(shù)為Null,那么返回的結(jié)果為Null,在表2.8中列舉了邏輯異或運(yùn)算的條件和結(jié)果:
表2.8  邏輯異或運(yùn)算的條件和結(jié)果
左操作數(shù)      右操作數(shù)      邏輯運(yùn)算結(jié)果
True      True      False
True      False      True
False      True      True
False      False      False
True      Null      Null
Null      True      Null
False      Null      Null
Null      False      Null
Null      Null      Null

例如,表達(dá)式 (2>3) Xor (3>4)的結(jié)果為False,表達(dá)式(2<3) Xor (3>4)的結(jié)果為True,而表達(dá)式(2>3) Xor Null的結(jié)果為Null。
當(dāng)異或運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)于二進(jìn)制數(shù)的每一位進(jìn)行異或運(yùn)算,運(yùn)算的時(shí)候遵循以下規(guī)則:0 Xor 0的結(jié)果為0,1 Xor 1的結(jié)果為0,其他情況下,結(jié)果為1。例如,4 Xor 5的結(jié)果是1,因?yàn)?的二進(jìn)制形式是100,而5的二進(jìn)制形式是101,按位異或操作之后結(jié)果是001,所以返回結(jié)果是1。同樣,在異或操作中,4和5的二進(jìn)制形式前面的0異或運(yùn)算之后仍然是0,并不影響結(jié)果。
2.5.3.5  等價(jià)運(yùn)算符(Eqv)
等價(jià)運(yùn)算符和異或運(yùn)算符正好相反,在等價(jià)運(yùn)算的過程中,如果兩個(gè)操作數(shù)同為True或同為False,返回結(jié)果為True,否則返回結(jié)果為False。如果有操作數(shù)為Null,那么返回的結(jié)果為Null,在表2.9中列舉了邏輯等價(jià)運(yùn)算的條件和結(jié)果:
表2.9  邏輯等價(jià)運(yùn)算的條件和結(jié)果
左操作數(shù)      右操作數(shù)      邏輯運(yùn)算結(jié)果
True      True      True
True      False      False
False      True      False
False      False      True
True      Null      Null
Null      True      Null
False      Null      Null
Null      False      Null
Null      Null      Null

例如,表達(dá)式 (2>3) Eqv (3>4)的結(jié)果為True,表達(dá)式(2<3) Eqv (3>4)的結(jié)果為False,而表達(dá)式(2>3) Eqv Null的結(jié)果為Null。
當(dāng)?shù)葍r(jià)運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)于二進(jìn)制數(shù)的每一位進(jìn)行等價(jià)運(yùn)算,運(yùn)算的時(shí)候遵循以下規(guī)則:0 Eqv 0的結(jié)果為1,1 Eqv 1的結(jié)果為1,其他情況下,結(jié)果為0。例如,4 Eqv 5的結(jié)果是-2,因?yàn)?的二進(jìn)制形式是00000000 00000100,而5的二進(jìn)制形式是00000000 00000101,按位異或操作之后結(jié)果是11111111 11111110,所以返回結(jié)果是-2。
2.5.3.6  蘊(yùn)涵運(yùn)算符(Imp)
蘊(yùn)涵運(yùn)算符實(shí)現(xiàn)了邏輯中的蘊(yùn)涵運(yùn)算,在蘊(yùn)涵運(yùn)算中,只有當(dāng)前提為True并且結(jié)果為False的情況下結(jié)果為False,在其余的情況下結(jié)果均為True。再考慮操作數(shù)為Null的情況之后,邏輯蘊(yùn)涵運(yùn)算的條件和結(jié)果如表2.10所示:
表2.10  邏輯蘊(yùn)涵運(yùn)算的條件和結(jié)果
左操作數(shù)      右操作數(shù)      邏輯運(yùn)算結(jié)果
True      True      True
True      False      False
False      True      True
False      False      True
True      Null      Null
Null      True      True
False      Null      True
Null      False      Null
Null      Null      Null

例如,表達(dá)式 (2>3) Imp (3>4)的結(jié)果為True,表達(dá)式(2<3) Imp (3>4)的結(jié)果為False,而表達(dá)式Null Imp (2>3)的結(jié)果為Null。
當(dāng)蘊(yùn)涵運(yùn)算符對(duì)數(shù)值進(jìn)行運(yùn)算的時(shí)候,對(duì)于二進(jìn)制數(shù)的每一位進(jìn)行蘊(yùn)涵運(yùn)算,運(yùn)算的時(shí)候遵循以下規(guī)則:只有在1 Imp 0的情況下結(jié)果為0,其他情況下結(jié)果均為1。例如,4 Imp 3的結(jié)果是-5,因?yàn)?的二進(jìn)制形式是00000000 00000100,而3的二進(jìn)制形式是00000000 00000011,按位蘊(yùn)涵操作之后結(jié)果是11111111 11111011,所以返回結(jié)果是-5。
2.5.4  連接運(yùn)算符
VBScript中有兩種連接運(yùn)算符:&運(yùn)算符和加法運(yùn)算符。連接運(yùn)算符可以將字符串相連,組合成為一個(gè)字符串。不過加法運(yùn)算符也可以應(yīng)用與數(shù)值運(yùn)算,在某些情況下,很容易引起混淆,所以我們建議連接的時(shí)候使&運(yùn)算符。由于我們已經(jīng)介紹過了加法運(yùn)算符,下面我們就來討論一下&運(yùn)算符:
&運(yùn)算符的語法如下所示:
Result = Exp1 & Exp2
其中,Result是表達(dá)式運(yùn)算結(jié)果,Exp1和Exp2則是表達(dá)式中的操作數(shù)。
&運(yùn)算符的功能是將兩個(gè)字符串相連,如果有操作數(shù)是非字符串類型,那么VBScript先將其轉(zhuǎn)換為字符串類型,然后再進(jìn)行字符串連接操作。如果操作數(shù)為Null或者Empty,那么將會(huì)被轉(zhuǎn)換成為空字符串(“”),只有在兩個(gè)操作數(shù)都為Null的情況下,不會(huì)進(jìn)行字符串連接,而是返回Null。例如:
“ASP ” & “World” = “ASP World”
3 & “a” = “3a”
3 & 4 = “34”
在對(duì)于字符串操作的時(shí)候,加法運(yùn)算符也能夠進(jìn)行字符串連接,不同的地方在于,加法運(yùn)算符進(jìn)行運(yùn)算的時(shí)候,不會(huì)如同連接字符串一樣將非字符串轉(zhuǎn)換為字符串,特別是,如果一個(gè)操作數(shù)是字符串,另外一個(gè)操作數(shù)是數(shù)值的時(shí)候,VBScript會(huì)將字符串轉(zhuǎn)換為數(shù)值,然后進(jìn)行加法運(yùn)算,例如:
3 + “4” = 7
在ASP頁面中進(jìn)行數(shù)據(jù)庫編程的時(shí)候,我們常常需要建立復(fù)雜的SQL語句,在這時(shí)候,我們可以先將SQL語句的各個(gè)部分以相對(duì)獨(dú)立而且較短小的字符串表示,然后再將這些字符串連接起來,組合成一條SQL語句。
2.5.5  運(yùn)算符優(yōu)先級(jí)
在VBScript中,一個(gè)表達(dá)式中可以存在多個(gè)運(yùn)算符,當(dāng)表達(dá)式具有多個(gè)運(yùn)算符的時(shí)候,VBScript將按照預(yù)定的順序計(jì)算表達(dá)式的各個(gè)部分,這個(gè)預(yù)定順序被稱為運(yùn)算符優(yōu)先級(jí)。如果在表達(dá)式中有括號(hào),那么首先將對(duì)括號(hào)內(nèi)的表達(dá)式進(jìn)行運(yùn)算,在括號(hào)內(nèi)表達(dá)式的運(yùn)算過程中,仍然遵循運(yùn)算符的優(yōu)先級(jí)關(guān)系。
在優(yōu)先級(jí)順序中,算術(shù)運(yùn)算符的優(yōu)先級(jí)最高,然后是連接運(yùn)算符,再往后是關(guān)系運(yùn)算符,邏輯運(yùn)算符的優(yōu)先級(jí)最低,在表2.11中列舉了運(yùn)算符的優(yōu)先級(jí)順序,在表中自上至下是優(yōu)先級(jí)從高到低的順序:
表2.11  VBScript運(yùn)算符優(yōu)先級(jí)順序(優(yōu)先級(jí)從高到低順序排列)
運(yùn)算符類型      運(yùn)算符符號(hào)      運(yùn)算符說明
算術(shù)運(yùn)算符      ^      冪運(yùn)算符
算術(shù)運(yùn)算符      -      被用作取負(fù)運(yùn)算符的減法運(yùn)算符
算術(shù)運(yùn)算符      *和/      乘法運(yùn)算符和除法運(yùn)算符
算術(shù)運(yùn)算符      \      整除運(yùn)算符
算術(shù)運(yùn)算符      Mod      模運(yùn)算符
算術(shù)運(yùn)算符      +和-      加法運(yùn)算符和減法運(yùn)算符
連接運(yùn)算符      &      
關(guān)系運(yùn)算符      =、<>、>、>=、<、<=、IS      所有關(guān)系運(yùn)算符優(yōu)先級(jí)相同
邏輯運(yùn)算符      Not      非運(yùn)算符
邏輯運(yùn)算符      And      與運(yùn)算符
邏輯運(yùn)算符      Or      或運(yùn)算符
邏輯運(yùn)算符      Xor      異或運(yùn)算符
邏輯運(yùn)算符      Eqv      等價(jià)運(yùn)算符
邏輯運(yùn)算符      Imp      蘊(yùn)涵運(yùn)算符

在表達(dá)式運(yùn)算的過程中,括號(hào)內(nèi)的表達(dá)式總是最先運(yùn)算的,然后根據(jù)運(yùn)算符的優(yōu)先順序從高到低開始運(yùn)算,如果有幾個(gè)運(yùn)算符優(yōu)先級(jí)一樣高,那么則按照運(yùn)算符從左到又的順序進(jìn)行計(jì)算。
例如,表達(dá)式7/3*2的結(jié)果是4.66666666666667,因?yàn)槌ㄟ\(yùn)算符和乘法運(yùn)算符的優(yōu)先級(jí)相同,在運(yùn)算的時(shí)候從左到右,先執(zhí)行除法運(yùn)算,然后再進(jìn)行乘法運(yùn)算。而表達(dá)式7\3*2的結(jié)果是1,這則是因?yàn)檎\(yùn)算符的優(yōu)先級(jí)比乘法運(yùn)算符的優(yōu)先級(jí)要低,首先進(jìn)行乘法運(yùn)算2*3=6,再進(jìn)行整除運(yùn)算7\6=1。
不過在這中情況下,也容易引起歧義,因?yàn)閷?duì)于表達(dá)式7\3*2而言,我們并不能判斷開發(fā)人員的用意是希望先進(jìn)行整除運(yùn)算還是先進(jìn)行乘法運(yùn)算,VBScript會(huì)根據(jù)優(yōu)先級(jí)設(shè)定作出自己的解釋,可這種解釋并不一定符合我們預(yù)先的設(shè)想,所以為了程序邏輯清晰起見,建議在容易引起歧義的部分加上合適的括號(hào)。例如對(duì)于表達(dá)式7\3*2,如果我們希望先進(jìn)行整除運(yùn)算,則改為(7\3)*2,這個(gè)括號(hào)是必需的;如果我們希望先進(jìn)行乘法運(yùn)算,則改為7\(3*2),在這里的括號(hào)則屬于解釋性的括號(hào)。對(duì)于優(yōu)先級(jí)設(shè)定十分清楚的開發(fā)人員而言,完全可以不必加上解釋性括號(hào),但是我們還是建議加上解釋性括號(hào),這可以增強(qiáng)程序的可讀性和易維護(hù)性,也是一種良好的編程風(fēng)格。

dyle_gg,2004-12-02 14:15:52

第3章  VBScript語句和過程
前面的章節(jié)中已經(jīng)詳細(xì)地介紹了有關(guān)VBScript語句的數(shù)據(jù)類型、常量、變量,但是,僅僅了解這些知識(shí)還是遠(yuǎn)遠(yuǎn)不夠的,也無法完成符合用戶需求的頁面。所以,在這一章節(jié)中我們將進(jìn)一步學(xué)習(xí)VBScript的知識(shí),主要包括VBScript的一些基本語句,如選擇語句和循環(huán)語句等,以及在VBScript中使用過程的具體方法等。學(xué)習(xí)這些知識(shí)也有助于讀者加深對(duì)不同程序結(jié)構(gòu)的理解。
3.1  VBScript語句中的基本語句
對(duì)于一般程序,有三類基本的程序結(jié)構(gòu)可以控制程序的流程:順序結(jié)構(gòu),分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)的流程是按照事務(wù)完成的先后次序依次執(zhí)行語句,而且總是在完成前一句語句之后再執(zhí)行后一句語句,并且執(zhí)行過的語句不再執(zhí)行,這就與分支結(jié)構(gòu)和循環(huán)結(jié)構(gòu)有所區(qū)別。分支結(jié)構(gòu)相當(dāng)于在實(shí)際生活中,我們對(duì)于判斷進(jìn)行選擇一樣,如果出現(xiàn)某些情況,我們將會(huì)如何做,如果不出現(xiàn)這些情況,我們將作如何打算。但是在程序中,分支結(jié)構(gòu)并不一定只有“是”或“否”這兩種選擇,也可以存在多種選擇的結(jié)構(gòu)。循環(huán)結(jié)構(gòu)是對(duì)于某一些語句進(jìn)行反復(fù)執(zhí)行,循環(huán)語句結(jié)束的關(guān)鍵往往是:當(dāng)符合某些條件,或不符合某些條件,或在重復(fù)執(zhí)行一定次數(shù)之后。一般而言,任何程序總是同時(shí)包含這三種結(jié)構(gòu)來對(duì)程序的流程進(jìn)行控制。在VBScript語句中,順序結(jié)構(gòu)最簡(jiǎn)單,一般不需要程序進(jìn)行什么控制;分支結(jié)構(gòu)可以使用選擇語句來實(shí)現(xiàn);循環(huán)結(jié)構(gòu)可以使用循環(huán)語句來實(shí)現(xiàn)。在下文中將具體介紹選擇語句和循環(huán)語句。
需要指出的是,在許多結(jié)構(gòu)化語言中,一般來說不提供Goto語句直接在程序中跳轉(zhuǎn),因?yàn)檫@將會(huì)極大地?fù)p害程序的可讀性,另外有一些結(jié)構(gòu)化語言雖然提供了Goto語句,但是不建議使用這條語句,而是建議使用Break、Continue等跳轉(zhuǎn)語句來代替,這些語句和Goto語句不同之處就在于,Goto語句是任意跳轉(zhuǎn)的,而Break、Continue語句并不能任意跳轉(zhuǎn),只是實(shí)現(xiàn)了循環(huán)的中斷退出功能。VBScript也不支持Goto語句,但在VBScript中,提供了Exit語句和On Error語句來實(shí)現(xiàn)程序流程的跳轉(zhuǎn)。
3.1.1  選擇語句
在VBScript中,有兩種條件語句:If…Then…Else語句和Select…Case語句(表3.1),這兩種條件語句執(zhí)行的時(shí)候,先對(duì)條件進(jìn)行判斷,然后根據(jù)條件執(zhí)行相應(yīng)的腳本。If…Then…Else語句只會(huì)形成兩重分支,如果條件滿足,執(zhí)行其中的一個(gè)分支,如果條件不滿足,則執(zhí)行其中的另外一個(gè)分支。Select…Case語句會(huì)形成多重分支,根據(jù)條件的結(jié)果選擇其中相應(yīng)的分支執(zhí)行。
表3.1  VBScript語句中的分支語句
If...Then...Else語句      二值分支語句
Select Case語句      多值分支語句

3.1.1.1  使用If...Then...Else語句
VBScript中最常用的條件語句就是If…Then…Else語句,一般If…Then…Else語句用來檢查一個(gè)布爾條件,然后根據(jù)結(jié)果為True或者False執(zhí)行相應(yīng)的腳本,如果為True,則執(zhí)行Then后面的腳本,如果為False,則執(zhí)行Else后面的腳本。
If…Then…Else語句有兩種形式:?jiǎn)涡行问胶投嘈行问?也稱塊形式),單行形式中整條語句都需要在一行中完成,其中也包括條件和判斷后執(zhí)行的腳本,其語法如下所示:
If condition Then statements [Else elsestatements]
多行形式的語法如下所示:
If condition Then
   statements
[Else
   elsestatements]
End If
其中,condition是測(cè)試條件,statements是條件為True的情況下所執(zhí)行的腳本,elsestatements是條件為False的情況下所執(zhí)行的腳本,如果條件為Null,那么執(zhí)行的腳本仍然是elsestatements。通常情況下,測(cè)試條件是使用比較運(yùn)算符對(duì)值或變量進(jìn)行比較的表達(dá)式。在這兩種語法中,Else都是可選的,如果沒有Else,則表明如果判斷條件為True,執(zhí)行Then后面的腳本,如果條件為False,則不執(zhí)行任何腳本。
注意:在多行形式中,語句結(jié)束的最后一行中有一句End If,而單行形式則不需要。
對(duì)于比較短小而簡(jiǎn)單的測(cè)試,我們可以使用單行形式。例如,如果學(xué)生成績(jī)大于60分,則判定成績(jī)?yōu)镻ass,否則判定其成績(jī)?yōu)镕ail,如以下腳本所示:
If Score >= 60 Then Status = “Pass” Else Status = “Fail”
不過,在編寫腳本的過程中,多行形式比單行形式的結(jié)構(gòu)化更強(qiáng),更加容易閱讀、維護(hù)和調(diào)試。對(duì)于上面單行形式的語句,我們可以改寫為多行形式如下:
If Score >= 60 Then
   Status = “Pass”
Else
   Status = “Fail”
End If
在VBScript中,還可以擴(kuò)展If…Then…Else語句的功能,通過添加ElseIf子句,我們可以對(duì)多個(gè)條件進(jìn)行判斷和分支選擇,其語法如下所示:
If condition Then
   statements
ElseIf conditin-n Then
   elseifstatements
Else
   elsestatements
End If

在條件語句中,如果條件是True時(shí)要執(zhí)行多個(gè)語句,條件是False時(shí)也需要執(zhí)行多個(gè)語句的時(shí)候,則就可以使用If...Then...Else語句來定義兩個(gè)語句塊:在Then后面的語句塊在條件是True時(shí)被執(zhí)行;在Else后面的語句塊在條件是False時(shí)被執(zhí)行。

Dim nTemp1, nTemp2
Dim nBigValue, nSmallValue
nTemp1 = CDbl ( InputBox ( “請(qǐng)輸入第一個(gè)數(shù)值:” ) )
nTemp2 = CDbl ( InputBox ( “請(qǐng)輸入第二個(gè)數(shù)值:” ) )
If  ( nTemp1 > nTemp2 ) Then
     nBigValue = nTemp1
     nSmallValue = nTemp2
Else
     nBigValue = nTemp2
     nSmallValue = nTemp1
End If

有時(shí)候,單個(gè)條件語句并不能滿足在多種選擇中做決定,所以用戶要采用If...Then...Else 語句的變形,從多種選擇中選取一種選擇。這種變形形式是在原來的條件語句上加上ElseIf子句,以擴(kuò)充其原有的功能,這樣能讓用戶的程序有多種不同的流程,方便了對(duì)于程序代碼行的控制。舉例如下:

Sub ReportValue(value)
     If value = 0 Then
         MsgBox value
     ElseIf value = 1 Then
         MsgBox value
     ElseIf value = 2 then
         Msgbox value
     Else
         Msgbox "Value out of range!"
     End If

用戶可以根據(jù)需要加上多個(gè)ElseIf子句以提供其它選項(xiàng)。但是,有時(shí)ElseIf子句用得太多,也常常會(huì)變成一種麻煩。經(jīng)常我們所采用的方法是使用可以進(jìn)行多種選擇的Select Case語句。
3.1.1.2  使用Select Case 語句
如果需要實(shí)現(xiàn)多重分支選擇,一般我們使用Select Case語句,而不使用If…Then…Else語句,盡管后者也完全能夠?qū)崿F(xiàn)這些功能。Select Case語句的功能就是根據(jù)表達(dá)式的值執(zhí)行幾組腳本當(dāng)中的一組。其語法如下所示:
Select Case testexpression
   Case expressionlist
      statements…
   Case Else expressionlist
      elsestatements
End Select
其中,testexpression是語句的判斷條件,可以是任何數(shù)值或者字符串表達(dá)式,expressionlist則是可能出現(xiàn)的表達(dá)式的值,statements和elsestatements是根據(jù)表達(dá)式結(jié)果執(zhí)行的腳本。
如果testexpression的表達(dá)式結(jié)果和某一個(gè)Case子句中列舉的值相符合,那么則執(zhí)行這一個(gè)Case子句和下一個(gè)Case子句之間的腳本,如果和任何列舉出的值都不符合,則執(zhí)行Case Else子句和End Select之間的腳本,如果再?zèng)]有Case Else語句,那么將會(huì)直接執(zhí)行End Select之后的腳本。如果表達(dá)式的結(jié)果和多個(gè)Case子句中的值相符合,則只會(huì)執(zhí)行第一個(gè)匹配后的語句。
其實(shí),Select Case語句提供了除了 If...Then...ElseIf 以外的另外一種條件語句的形式,可允許用戶從多個(gè)語句塊中作出一個(gè)選擇,并執(zhí)行相應(yīng)的語句。Select Case 語句提供的功能和 If...Then...Else 語句類似,但它可使整個(gè)程序代碼行執(zhí)行起來更加的有效率,而且也提高了程序的可讀性。
Select Case語句在其前端,即Select Case子句后有一個(gè)測(cè)試運(yùn)算式,這個(gè)運(yùn)算式只會(huì)被執(zhí)行一次。執(zhí)行完后的結(jié)果將被用來和每一個(gè) Case子句的值作比較。如果有相符的情況時(shí),這個(gè)Case 子句后的語句塊就將被執(zhí)行,注意下面這個(gè)例子:

Select Case Document.Form1.CardType.Options(SelectedIndex).Text
    Case "MasterCard"
        DisplayMCLogo
        ValidateMCAccount
    Case "Visa"
        DisplayVisaLogo
        ValidateVisaAccount
    Case "American Express"
        DisplayAMEXCOLogo
        ValidateAMEXCOAccount
    Case Else
        DisplayUnknownImage
        PromptAgain
End Select

從上面的程序中可以注意到Select Case 語句只在前端執(zhí)行一個(gè)運(yùn)算式。而與此相反的是,If...Then...ElseIf條件語句則可在每一個(gè)ElseIf語句后面加上一個(gè)不同的比較運(yùn)算式。對(duì)于這種格式的語句,只有在每一個(gè)ElseIf語句使用的都是同一個(gè)運(yùn)算式時(shí),才能用Select Case語句來取代If...Then...ElseIf語句。
與If語句相同,Select Case語句也可以嵌套,只是對(duì)于每一層嵌套的Select Case語句中必須有與其相對(duì)應(yīng)的End Select語句。
3.1.2  循環(huán)語句
使用循環(huán)語句可以反復(fù)執(zhí)行某段腳本,直到滿足循環(huán)結(jié)束條件后才停止。如表3.2所示,在VBScript中,提供了四種循環(huán)語句:For…Next語句、Do…Loop語句、While…Wend語句和For Each…Next語句。在這四種循環(huán)語句中,F(xiàn)or Each…Next語句是比較特殊的一種,它不是指定循環(huán)的次數(shù)、也沒有指定循環(huán)的結(jié)束條件,而是提供了枚舉集合中元素的一種方法。運(yùn)用循環(huán)語句,可以極大地方便我們開發(fā)腳本的工作。
表3.2  VBScript語句中的循環(huán)語句
Do...Loop      當(dāng)條件是 True 時(shí)執(zhí)行循環(huán),也可以是執(zhí)行到條件為 True 時(shí),停止循環(huán)。
While...Wend      當(dāng)條件是 True 就執(zhí)行循環(huán)。
For...Next      使用一個(gè)計(jì)數(shù)器,讓語句重復(fù)執(zhí)行某個(gè)固定的次數(shù)。
For Each...Next      對(duì)每個(gè)集合對(duì)象中的項(xiàng)目或數(shù)組中的元素重復(fù)執(zhí)行一次循環(huán)。

3.1.2.1  For…Next語句
For…Next語句在循環(huán)的過程中,可以指定循環(huán)運(yùn)行的次數(shù),當(dāng)?shù)竭_(dá)循環(huán)運(yùn)行次數(shù)之后,退出循環(huán)。其語法如下所示:
For counter = start To end Step stepsize
   statements
Next
其中,counter是用作循環(huán)計(jì)數(shù)器的數(shù)值變量,start是循環(huán)變量的初值,end是循環(huán)變量的終值,stepsize是循環(huán)變量的步長(zhǎng),在默認(rèn)條件下stepsize=1,statements是循環(huán)內(nèi)反復(fù)執(zhí)行的腳本。
在執(zhí)行For…Next語句有以下幾個(gè)步驟:
1. 將初值賦給循環(huán)變量,即執(zhí)行counter=start;
2. 判斷循環(huán)條件,如果循環(huán)步長(zhǎng)大于等于0,則循環(huán)條件是counter<=end,如果循環(huán)步長(zhǎng)小于0,則循環(huán)條件是counter>=end,如果循環(huán)條件為True,則執(zhí)行循環(huán)中的語句,如果循環(huán)條件為False,則跳出循環(huán);
3. 執(zhí)行循環(huán)代碼,再將步長(zhǎng)累加到循環(huán)計(jì)數(shù)器上,即執(zhí)行counter=counter+stepsize,然后返回步驟2判斷循環(huán)條件。
舉個(gè)例子。下面的程序會(huì)計(jì)算從1到50所有數(shù)值相乘的結(jié)果。這個(gè)For語句指定了一個(gè)計(jì)數(shù)器I,同時(shí)指定了該計(jì)數(shù)器的起始值和結(jié)束值。Next語句會(huì)使計(jì)數(shù)器的值在每次循環(huán)執(zhí)行時(shí)自動(dòng)遞增1。使用Visual Basic的編程人員注意,在VB語句中的For語句在Next語句之后必須跟有作為計(jì)數(shù)器的變量,而在VBScript語句中,該變量不必再寫了。

Dim I, nResult
nResult = 1
For I = 1 To 50
     nResult = nResult * I
Next
MsgBox “結(jié)果為:” & nResult

使用Step關(guān)鍵字,用戶就可以隨自己的需要來遞增或是遞減計(jì)數(shù)器變量。在下面的例子中,計(jì)數(shù)器變量j會(huì)在每次循環(huán)執(zhí)行后遞增2。當(dāng)循環(huán)執(zhí)行完時(shí),變量nResult將是2、4、6、8和10的總和。

Dim j, nResult
nResult = 0
For j = 2 To 10 Step 2
total = total + j
Next
MsgBox “結(jié)果為:” & nResult

如果用戶要使計(jì)數(shù)器變量遞減時(shí),則可以使用負(fù)的Step值。此時(shí),結(jié)束值必須小于起始值。在下面例子中,計(jì)數(shù)器變量myNum會(huì)在每次循環(huán)執(zhí)行過后遞減2。當(dāng)這個(gè)循環(huán)結(jié)束時(shí),變量total的值將會(huì)是16、14、12、10、8、6、4和2的總和。

Dim nStep nResult
nResult = 0
For nStep = 16 To 2 Step -2
nResult = nResult + nStep
Next
MsgBox “結(jié)果為:” & nResult

用戶可以使用Exit For語句在計(jì)數(shù)器到達(dá)其結(jié)束值之前跳離For...Next語句。因?yàn)橥ǔS脩糁粫?huì)希望在某些特定的情形發(fā)生時(shí),才要跳離循環(huán),比如像發(fā)生了錯(cuò)誤時(shí)。所以用戶應(yīng)該把Exit Do語句放在If...Then...Else語句的Then子句之后的語句中。當(dāng)條件是False時(shí),循環(huán)就會(huì)照常執(zhí)行。
需要指出的是,VBScript和Visual Basic的Next語句在使用上有所不同,Visual Basic中,Next語句后一般要求一個(gè)循環(huán)變量,但在VBScript中,Next語句后不要求循環(huán)變量,如果后面有循環(huán)變量,反而會(huì)導(dǎo)致錯(cuò)誤的出現(xiàn)。
一般情況下,我們不建議在循環(huán)執(zhí)行的過程中,使用語句改變循環(huán)計(jì)數(shù)器的值,因?yàn)檫@樣會(huì)使得腳本的可讀性變差,代碼的調(diào)試和維護(hù)工作都會(huì)變得困難得多。
在循環(huán)中,我們還可以使用循環(huán)嵌套,不過循環(huán)嵌套的過程中,要求各重循環(huán)計(jì)數(shù)器的變量不同,例如:

For I = 1 To 10
   For J = 1 To 10
   ……
   Next
Next

3.1.2.2  Do…Loop語句
Do…Loop語句和For…Next語句有所不同,F(xiàn)or…Next語句中,循環(huán)執(zhí)行的次數(shù)是確定的,而Do…Loop中,循環(huán)執(zhí)行的次數(shù)則往往是不確定的,如果循環(huán)條件為True或者循環(huán)條件變?yōu)門rue,循環(huán)將會(huì)一直執(zhí)行。
Do…Loop語句有兩種形式:Do While/Until…Loop和Do…Loop While/Until。
我們先來看第一種形式。Do While/Until…Loop的語法如下所示:
Do { While|Until} condition
   statements
Loop
其中,condition是循環(huán)執(zhí)行條件,statements是循環(huán)內(nèi)反復(fù)執(zhí)行的腳本。
Do While/Until…Loop循環(huán)的執(zhí)行步驟如下所示:
1. 如果是Do While…Loop循環(huán),則判斷condition是否滿足,如果滿足,則進(jìn)入步驟2執(zhí)行循環(huán)內(nèi)腳本,否則跳出循環(huán);如果是Do Until…Loop循環(huán),則判斷condition是否不滿足,如果不滿足,則進(jìn)入步驟2執(zhí)行循環(huán)內(nèi)腳本,如果滿足condition,則跳出循環(huán);
2. 執(zhí)行循環(huán)中腳本,然后返回步驟1。
在Do...Loop語句中,需用While關(guān)鍵字來檢查條件。用戶可以在進(jìn)入循環(huán)之前就先檢查條件,或在循環(huán)至少執(zhí)行過一次之后再檢查,比如下面的ChkLastWhile例子。在ChkFirstWhile程序中,如果myNum不是設(shè)成20,而是設(shè)成9,那么在循環(huán)中的語句就永遠(yuǎn)不會(huì)被執(zhí)行。在ChkLastWhile程序中,循環(huán)里的語句只會(huì)被執(zhí)行一次。因?yàn)樗臈l件已經(jīng)是False了。

Sub ChkFirstWhile()
     Dim counter, myNum
     counter = 0
     myNum = 20
     Do While myNum > 10
         myNum = myNum - 1
         counter = counter + 1
     Loop
     MsgBox "The loop made " & counter & " repetitions."
End Sub

Sub ChkLastWhile()
     Dim counter, myNum
     counter = 0
     myNum = 9
     Do
         myNum = myNum - 1
         counter = counter + 1
     Loop While myNum > 10
     MsgBox "The loop made " & counter & " repetitions."
End Sub

而如果我們將上述腳本中的While改為Until,再執(zhí)行這段腳本,我們則會(huì)發(fā)現(xiàn)執(zhí)行結(jié)果不一樣了。這是由于Do Until…Loop中,在執(zhí)行循環(huán)內(nèi)代碼前先判斷循環(huán)條件是否不滿足,只有在不滿足的情況下,Do Until…Loop才會(huì)執(zhí)行循環(huán)內(nèi)腳本,而如果滿足,則循環(huán)內(nèi)代碼一次也不會(huì)執(zhí)行。
在Do...Loop語句中,用戶有兩種方法來使用Until關(guān)鍵字檢查條件。用戶可以在進(jìn)入循環(huán)前先檢查條件,或在循環(huán)至少執(zhí)行過一次后再檢查(如下面的ChkLastUntil例子)。只要在條件是False時(shí),循環(huán)就會(huì)執(zhí)行。

Sub ChkFirstUntil( )
     Dim counter, myNum
     counter = 0
     myNum = 20
     Do Until myNum = 10
         myNum = myNum - 1
         counter = counter + 1
     Loop
     MsgBox "The loop made " & counter & " repetitons."
End Sub

Sub ChkLastUntil()
     Dim counter, myNum
     counter = 0
     myNum = 1
     Do
         myNum = myNum + 1
         counter = counter + 1
     Loop Until myNum = 10
     MsgBox "The loop made " & counter & " repetitions."
End Sub

我們?cè)賮砜吹诙N形式。Do…Loop While/Until的語法如下所示:
Do
   statements
Loop { While|Until} condition
其中,condition是循環(huán)執(zhí)行條件,statements是循環(huán)內(nèi)反復(fù)執(zhí)行的腳本。
Do…Loop While/Until循環(huán)的執(zhí)行步驟如下所示:
1. 執(zhí)行循環(huán)中腳本;
2. 對(duì)于Do…Loop While循環(huán),則判斷condition是否滿足,如果滿足,返回步驟1執(zhí)行循環(huán)內(nèi)腳本,否則跳出循環(huán);如果是Do…Loop Until循環(huán),則判斷condition是否不滿足,如果不滿足,則返回步驟1執(zhí)行循環(huán)內(nèi)腳本,如果滿足condition,則跳出循環(huán)。
如果我們將上述腳本中的While改為Until,再執(zhí)行這些腳本,我們就會(huì)發(fā)現(xiàn)結(jié)果和Do Until…Loop的結(jié)果有所不同。這是由于在Do…Loop Until循環(huán)中,首先將執(zhí)行一次循環(huán)內(nèi)腳本,然后再對(duì)循環(huán)條件進(jìn)行判斷,這也就是說,不論循環(huán)條件如何設(shè)定,Do…Loop While/Until循環(huán)都將至少執(zhí)行一次循環(huán)內(nèi)的腳本。
注意,在Do…Loop循環(huán)中一定要有改變循環(huán)條件中變量的語句,否則,很有可能會(huì)陷入死循環(huán)而不能終止。就技術(shù)上來說,用戶可以在Do...Loop中使用Exit Do語句來跳離循環(huán)。因?yàn)橥ǔS脩糁粫?huì)希望在某些特定的情形發(fā)生時(shí),才需要跳離循環(huán)語句,比如像要避免死循環(huán)時(shí),用戶應(yīng)該把Exit Do語句放在If...Then...Else語句的Then之后的語句塊中。當(dāng)條件是False時(shí),循環(huán)就會(huì)照常執(zhí)行,而當(dāng)條件為True時(shí),即滿足離開循環(huán)的條件時(shí),將執(zhí)行Exit Do語句。
在下面的例子中,myNum將會(huì)被指定成一個(gè)會(huì)造成無限循環(huán)的值。其中的If...Then...Else語句將會(huì)檢查這個(gè)條件,以避免無限死循環(huán)的發(fā)生。

Sub ExitExample()
     Dim counter, myNum
     counter = 0
     myNum = 9
     Do Until myNum = 10
         myNum = myNum - 1
         counter = counter + 1
         If myNum < 10 Then Exit Do
     Loop
     MsgBox "The loop made " & counter & " repetitions."
End Sub

3.1.2.3  While…Wend語句
While…Wend語句和Do…Loop語句十分類似,但不如Do…Loop語句那樣靈活,在While…Wend語句中,如果條件為True,則執(zhí)行循環(huán)內(nèi)腳本。其語法如下所示:
While condition
   statements
Wend
其中,conditin是循環(huán)執(zhí)行條件,statements是循環(huán)內(nèi)執(zhí)行的腳本。
While…Wend語句的執(zhí)行步驟如下所示:
1. 判斷condition是否為True,如果為True,則進(jìn)入步驟2執(zhí)行循環(huán)內(nèi)腳本,如果為False或者為Null,則跳出循環(huán);
2. 執(zhí)行循環(huán)中腳本,然后返回步驟1。
與Do … Loop語句不同的是,While循環(huán)語句沒有任何可以跳離循環(huán)的語句,用戶不能想當(dāng)然地使用Exit While語句。
不過,和Do…Loop語句比較而言,While…Wend語句的靈活性要差一些,腳本的清晰程度則是相同的,所以我們建議,在同樣的情況下,還是使用Do…Loop語句。
3.1.2.4  For Each…Next語句
For Each…Next語句和上述三個(gè)循環(huán)語句都有所不同,它既不指定循環(huán)執(zhí)行的次數(shù),也不指定循環(huán)結(jié)束條件,而是對(duì)數(shù)組和集合中的元素進(jìn)行枚舉,當(dāng)枚舉結(jié)束之后才會(huì)退出循環(huán)。其語法如下所示:
For Each element In group
   statements
Next
其中,group是我們進(jìn)行枚舉的數(shù)組或者集合,element是枚舉變量的名稱,statements是對(duì)于每個(gè)元素都會(huì)執(zhí)行的循環(huán)腳本。
For Each...Next和For...Next循環(huán)非常相似。它們的不同之處在于,F(xiàn)or Each...Next循環(huán)是針對(duì)集合對(duì)象中的每一個(gè)對(duì)象或數(shù)組中的每一個(gè)元素重復(fù)執(zhí)行一次循環(huán),而ForEach...Next循環(huán)語句是依指定的數(shù)字重復(fù)執(zhí)行循環(huán)的次數(shù)。當(dāng)用戶不知道集合對(duì)象中有幾個(gè)元素時(shí),F(xiàn)or Each...Next循環(huán)語句將會(huì)特別的有用。
在下面的HTML程序范例中,Dictionary對(duì)象的功能是要將文字放到數(shù)個(gè)文本框中:

<HTML>
<HEAD>
<TITLE>簡(jiǎn)單例子</TITLE>
</HEAD>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub btnFill_OnClick
    Dim d                   ‘定義一個(gè)對(duì)象變量
    Set d = CreateObject("Scripting.Dictionary") ‘建立一個(gè)Dictionary對(duì)象
    d.Add "0", "Sanders"     ‘將有關(guān)信息放入該對(duì)象之中
    d.Add "1", "Shirley"
    d.Add "2", "Winfred"

    For Each I in d
        Document.Form.Elements(I).Value = D.Item(I)
                                         ‘將文字放入文本框之中
    Next
End Sub
-->
</SCRIPT>
<BODY>
<CENTER>
<FORM NAME="Form"

<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Text"><p>
<Input Type = "Button" NAME=btnFill VALUE="填入信息"><p>
</FORM>
</CENTER>
</BODY>
</HTML>

3.1.2.5  Exit語句
在結(jié)構(gòu)化程序設(shè)計(jì)的過程中,Goto語句的取消可以極大地增強(qiáng)程序的可讀性,便于程序的閱讀與維護(hù),不過,也不可避免帶來了一些不足之處。在某些循環(huán)嵌套的程序中,在合適的地方使用Goto語句能夠使程序顯得簡(jiǎn)潔明了,并且代碼效率高,在禁止使用Goto語句的場(chǎng)合中,雖然不使用Goto語句也完全能夠?qū)崿F(xiàn)同樣的功能,但是卻使得程序的可讀性和代碼效率形成了一種矛盾,要么追求代碼的高效率而使得程序晦澀難懂,要么追求程序結(jié)構(gòu)清晰而降低了代碼的效率。所以在C語言中提供了break、continue、Exit等半結(jié)構(gòu)化語句,這些語句能夠?qū)崿F(xiàn)一定的跳轉(zhuǎn)功能,保持代碼的高效,也能夠使得程序保持較強(qiáng)的可讀性。
在VBScript中也提供了類似的語句,使用Exit語句能夠停止程序當(dāng)前正在執(zhí)行的邏輯,退出循環(huán)或者當(dāng)前過程。它能夠退出Do…Loop、For…Next循環(huán),也能夠退出Function和Sub的過程處理,關(guān)于Function定義的函數(shù)和Sub定義的過程,我們會(huì)在下一節(jié)中介紹。
Exit語句有以下四種語法形式:
1. Exit Do:提供了一種退出Do…Loop循環(huán)的方法,Exit Do只能在Do…Loop語句中使用,執(zhí)行Exit Do語句之后將控制權(quán)轉(zhuǎn)移到Loop語句之后。
2. Exit For:提供了一種退出For循環(huán)的方法,Exit For語句只能在For…Next語句或者For Each…Next循環(huán)中使用,執(zhí)行Exit For語句之后將控制權(quán)轉(zhuǎn)移到Next語句之后。
3. Exit Function:執(zhí)行Exit Function語句之后退出當(dāng)前函數(shù)。
4. Exit Sub:執(zhí)行Exit Sub語句之后退出當(dāng)前過程。
例如,我們可以使用Exit Do語句實(shí)現(xiàn)一個(gè)死循環(huán)中的退出,在下面的腳本中,當(dāng)循環(huán)計(jì)數(shù)器大于10之后,退出循環(huán)處理,而循環(huán)本身并不具備結(jié)束循環(huán)的功能:

counter = 0
Do While True
   counter = counter + 1
   If counter > 10 Then Exit Do
Loop

當(dāng)然上面的腳本完全不需要使用Exit Do語句,但是在許多場(chǎng)合中,使用Exit語句之后能夠顯著提高腳本的執(zhí)行效率。
3.2  VBScript語句中的過程
掌握了一些基本概念后,程序設(shè)計(jì)和編制就變成了一個(gè)不斷重復(fù)的過程。用戶需要多次重復(fù)某些步驟,或是某些語句來完成某一所需處理的任務(wù)。出于程序的可讀性、可調(diào)試性和簡(jiǎn)單性的考慮,在實(shí)際的編程過程中,我們會(huì)將這些用于實(shí)現(xiàn)某一特定功能,而且相對(duì)集中的語句放在一個(gè)子程序中,稱為過程。在過程中的語句一般和其他過程中的語句,或和主程序(相對(duì)于子程序而言)中語句沒有什么直接聯(lián)系。在VBScript中,過程被分為兩類:Sub過程和Function過程。前面的舉例程序中我們已經(jīng)接觸過這兩個(gè)過程,但我們沒有展開介紹。下面就具體談?wù)勥@兩種類型的過程。
3.2.1  Sub過程
Sub過程是由一些功能實(shí)現(xiàn)相對(duì)集中的VBScript語句組成。這些語句以Sub語句作為過程的開頭,以End Sub語句作為其結(jié)束。這些語句被執(zhí)行操作時(shí)并不返回任何數(shù)值,這一點(diǎn)和后面所談到的Function過程有本質(zhì)的區(qū)別,所以有些書上也將Sub過程稱為子程序。Sub過程可以使用參數(shù)(由調(diào)用過程的主程序?qū)⑺璧某A?、變量或表達(dá)式傳遞給過程)。如果Sub過程無任何參數(shù),則Sub語句必須包含空括號(hào)( ),該括號(hào)不能省略。
比如我們希望寫一段程序,用于彈出一個(gè)對(duì)話框,并在對(duì)話框上顯示一段提示信息。在這個(gè)程序中,關(guān)于對(duì)話框的實(shí)現(xiàn)在程序的任何地方都是一致的,所不同的是相應(yīng)的提示信息。我們可以寫一段Sub過程,來處理這一特定的功能。

<SCRIPT LANGUAGE="VBScript">
<!--
Sub CreateMessageBox( strInfo )
Dim strComplete
StrComplete = “提示信息:” & strInfo & “!”
    MsgBox strComplete
End Sub
-->
</SCRIPT>

在這段程序中,CreateMessageBox是過程名稱,strInfo是參數(shù),整個(gè)過程包含在Sub和End Sub之中。該過程相當(dāng)簡(jiǎn)單,只有三行語句。第一句定義了一個(gè)變量strComplete,該變量將用于對(duì)話框上的提示信息;第二句是根據(jù)參數(shù)的內(nèi)容組織成一個(gè)完整的提示信息,并將該值賦給變量strComplete;第三句是將該信息用對(duì)話框的形式來提供給用戶。
以后用戶在程序中的任何地方只要寫:
CreateMessageBox “Hello, World”
或者
Call CreateMessageBox (“Hello, World”)
即可調(diào)用該過程。
對(duì)于通過值傳遞的參數(shù),在調(diào)用過程的時(shí)候,VBScript會(huì)在過程內(nèi)部暫時(shí)建立一個(gè)變量,并將參數(shù)值復(fù)制給這個(gè)變量,這樣就可以把過程外部的數(shù)值傳遞到過程內(nèi)部中,不過這個(gè)變量只是在過程內(nèi)部有效的,在腳本中改變變量的值的時(shí)候,并不會(huì)對(duì)參數(shù)造成任何影響,當(dāng)腳本結(jié)束過程調(diào)用的時(shí)候,這個(gè)變量將被刪除。
而對(duì)于通過地址傳遞的參數(shù),在調(diào)用過程的時(shí)候,VBScript將參數(shù)的地址傳遞到過程中去,過程中的變量名稱實(shí)際是對(duì)于這一塊地址的引用,當(dāng)過程中變量的值發(fā)生變化的時(shí)候,也就意味著該地址中的數(shù)據(jù)發(fā)生了變化。
在腳本中調(diào)用過程有兩種方法:一種是使用Call語句的顯式調(diào)用,另外一種是不使用Call語句的隱式調(diào)用。這兩種調(diào)用方法的效果其實(shí)是一樣的,隱式調(diào)用的時(shí)候,只需要在腳本中輸入過程的名稱和參數(shù)的名稱就可以了,參數(shù)之間用逗號(hào)進(jìn)行分隔,而在顯式調(diào)用的時(shí)候,必須在過程名稱之后加上括號(hào),并且使得參數(shù)包含在括號(hào)中,即:
CreateMessageBox “Hello, World”
Call CreateMessageBox (“Hello, World”)
上面的兩條語句中,前面一條語句是過程的顯式調(diào)用,后面是隱式調(diào)用。
在過程執(zhí)行的時(shí)候,如果希望滿足某種條件后直接退出過程的處理邏輯,返回主程序,我們可以使用Exit Sub語句,執(zhí)行Exit Sub語句,腳本的執(zhí)行將立即從過程中退出,這樣可以極大地方便我們腳本的編寫,提高程序的靈活性。
在Windows操作系統(tǒng)中,由于采取的是一種使用消息機(jī)制來驅(qū)動(dòng)程序,所以我們往往將一些對(duì)于消息或是事件的處理語句作為一個(gè)Sub過程。關(guān)于消息機(jī)制和事件驅(qū)動(dòng)的概念由于不是本書的內(nèi)容,這里不再贅述。如果需要了解這方面內(nèi)容,可以參閱有關(guān)Windows編程的書籍。在這里我們只需要知道觸發(fā)某一事件之后的代碼寫在哪個(gè)Sub過程中即可。
請(qǐng)看下面這個(gè)例子。我們要放置一個(gè)按鈕,按下這個(gè)按鈕之后將會(huì)彈出一個(gè)對(duì)話框。這是一個(gè)簡(jiǎn)單的程序,但這個(gè)程序反映了如何使用控件和Sub過程。我們首先要在頁面上放置一個(gè)按鈕,代碼如下:

<INPUT id=btnMsg name=btnMsg type=button value="提示信息">
該語句定義了一個(gè)按鈕,該按鈕的名字為btnMsg,按鈕上的文字為“提示信息”。
<SCRIPT LANGUAGE="VBScript">
<!--
Sub btnMsg_onClick()
Dim MsgInfo
MsgInfo = “Hello, World”
CreateMessageBox MsgInfo
End Sub
-->
</SCRIPT>

這段語句是用于在按下按鈕之后所需要執(zhí)行的代碼。由于在VBScript中不像MFC中對(duì)于任何的Windows消息有相應(yīng)的消息映射,而是簡(jiǎn)化成了一些直觀的過程。這些過程往往在名稱上就直接反映了其與各類消息之間的聯(lián)系。例如在上述的例子中我們就可以看到關(guān)于btnMsg按鈕的點(diǎn)擊事件中的語句是寫在一個(gè)名為btnMsg_onClick( )的過程中,其中btnMsg是按鈕的名稱,onClick說明了在該按鈕點(diǎn)擊后所需要響應(yīng)的代碼。我們可以根據(jù)這個(gè)例子觸類旁通,知道凡是帶有這樣結(jié)構(gòu)命名的Sub過程都是系統(tǒng)指定的消息函數(shù),希望用戶自定義的函數(shù)不要和該名稱沖突。在該過程中,又調(diào)用了上述定義的CreateMessageBox過程,當(dāng)然該語句也可以寫成Call CreateMessageBox(MsgInfo),注意,括號(hào)不要漏掉。
3.2.2  Function過程
Function過程與Sub過程相類似,也是由一系列VBScript語句所組成,這些語句是以Function語句作為該Function過程的開頭標(biāo)記,以End Function語句作為結(jié)束。Function過程在操作執(zhí)行結(jié)束后,可以返回值,這一點(diǎn)和Sub過程相區(qū)別,所以有的書上將Function過程稱為函數(shù),以與子程序相對(duì)應(yīng)。在本書中,仍然稱作Sub過程和Function過程。Function過程可以使用參數(shù)(由調(diào)用過程的主程序?qū)⑦^程所需要的常量、變量或表達(dá)式傳遞給過程)。如果Function過程無任何參數(shù),則Function語句必須包含空括號(hào)( )。Function過程通過函數(shù)名返回一個(gè)值,這個(gè)值是在過程的語句中賦給函數(shù)名的。Function返回值的數(shù)據(jù)類型總是Variant。這一點(diǎn)和其他的程序中所定義的函數(shù)返回類型所不同。調(diào)用Function過程時(shí),函數(shù)名必須用在變量賦值語句的右端或表達(dá)式中。
這里有一個(gè)簡(jiǎn)單的例子,但基本上反映了Function過程的使用情況:
<SCRIPT LANGUAGE="VBScript">
<!—
Function AddSum(Value1, Value2)
     AddSum = Value1 + Value2
End Function
-->
</SCRIPT>

最后對(duì)于Function過程要說明的是,F(xiàn)unction過程的返回值是直接對(duì)于該過程名稱進(jìn)行賦值,而不是像其他語言中使用Return語句。

dyle_gg,2004-12-02 14:16:37

3.2.3  參數(shù)說明
關(guān)于過程引用的參數(shù),這里還需要說明的是,參數(shù)作為主程序和過程之間進(jìn)行數(shù)據(jù)通信的途徑和手段而存在。參數(shù)名可以是任何有效的變量名。使用Sub語句或Function語句創(chuàng)建過程時(shí),過程名之后必須緊跟括號(hào)。括號(hào)中包含所有參數(shù),參數(shù)間用逗號(hào)分隔。
要從過程中獲取數(shù)據(jù),必須使用Function過程。請(qǐng)記住,F(xiàn)unction過程可以返回值;Sub過程不返回值。但是如果我們要求一個(gè)過程返回多個(gè)數(shù)值的時(shí)候,只依靠Function過程返回的一個(gè)數(shù)值是遠(yuǎn)遠(yuǎn)不夠的,在這種情況下,有些C++編程人員會(huì)使用指針參數(shù)來解決這個(gè)問題,而在VBScript語句中,并沒有指針類型這個(gè)概念,但我們依然可以使用相類似的方法來解決這個(gè)問題。這時(shí)候我們只需要在過程的參數(shù)前面加上ByRef的關(guān)鍵字,該參數(shù)如果在過程中被修改,在主程序中相對(duì)應(yīng)的變量的值也將被修改;如果在參數(shù)前面什么也不加,或是加上ByVal,即使該參數(shù)在過程中被改變,也不會(huì)影響到主程序中的變量。這是因?yàn)锽yRef是將變量的引用傳遞給過程,這樣主程序和過程中調(diào)用的是同一個(gè)變量;而使用ByVal或則什么也不使用,則是將主程序中的變量的副本傳遞給過程,這樣在過程中,該參數(shù)即使改變,也只是改變這個(gè)變量的副本,在過程結(jié)束后,這個(gè)副本將隨之一起消失,那么其對(duì)于主程序的變量而言是沒有一點(diǎn)影響的。這樣我們可以使用ByRef關(guān)鍵字來進(jìn)行主程序和過程之間多個(gè)數(shù)值的傳遞。
看一下下面這個(gè)例子,這個(gè)例子中我們需要寫一個(gè)函數(shù),該函數(shù)是要將兩個(gè)數(shù)值進(jìn)行相加,然后對(duì)于每個(gè)相加的加數(shù)進(jìn)行自增運(yùn)算。如果不使用ByRef關(guān)鍵字,我們是無法在一個(gè)函數(shù)中同時(shí)返回三個(gè)數(shù)值的。

<SCRIPT LANGUAGE="VBScript">
<!--
Function AddSum(ByRef Value1, ByRef Value2)
     AddSum = Value1 + Value2
     Value1 = Value1 + 1
     Value2 = Value2 + 2
End Function

Sub btnSum_onClick()
     Dim a,b
     a = 10
     b = 20
     txtSum.value = AddSum(a,b)
End Sub
-->
</SCRIPT>

由于AddSum函數(shù)中使用了在每個(gè)加數(shù)前都使用了ByRef關(guān)鍵字,所以該加數(shù)在AddSum函數(shù)中修改其值,將直接影響到主程序中a和b的值。完整的程序如下:

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE></TITLE>
<SCRIPT LANGUAGE="VBScript">
<!--
Function FillterNum(NumValue)
     If (IsNumeric(NumValue)) Then
           FillterNum = NumValue
     Else
           FillterNum = 0
     End If
End Function

Function AddSum(ByRef Value1, ByRef Value2)
     AddSum = Value1 + Value2
     Value1 = Value1 + 1
     Value2 = Value2 + 2
End Function

Sub btnSum_onClick()
     Dim a,b
     a = FillterNum(txtValue1.value)
     b = FillterNum(txtValue2.value)
     txtSum.value = AddSum(a,b)
     txtValue1.value = a
     txtValue2.value = b
End Sub
-->
</SCRIPT>
</HEAD>
<BODY>

<P>數(shù)值1 = <INPUT id=txtValue1 name=text1
style="HEIGHT: 22px; WIDTH: 115px"></P>
<P>數(shù)值2 = <INPUT id=txtValue2 name=text2
style="HEIGHT: 22px; WIDTH: 115px"></P>
<P>總和 = <INPUT id=txtSum name=text3 style="HEIGHT: 22px; WIDTH: 115px"></P>
<P><INPUT id=btnSum name=button1 type=button value="自增求和"></P>

</BODY>
</HTML>

該程序中的FillterNum函數(shù)是一個(gè)用于處理文本框中輸入信息,約束該信息必須為數(shù)值信息,否則作為0處理。
該程序中使用瀏覽器打開,將會(huì)出現(xiàn)三個(gè)文本框和一個(gè)按鈕。在第一和第二個(gè)文本框中填入數(shù)值,按下按鈕,在第三個(gè)文本框中將會(huì)出現(xiàn)上面兩個(gè)文本框的數(shù)值之和,而第一和第二個(gè)文本框中的數(shù)值也會(huì)進(jìn)行自增操作。如果用戶有興趣,可以將AddSum函數(shù)中參數(shù)前的ByRef該為ByVal,或是干脆去掉,再看一下效果,就會(huì)對(duì)上述文字有進(jìn)一步的了解。
3.2.4  相關(guān)語句的語法
在本章節(jié)中使用到一些語句,這些語句主要用于過程的調(diào)用和定義。
3.2.4.1  Call語句
調(diào)用Sub過程時(shí),可以使用Call語句。在調(diào)用過程時(shí),不必使用Call關(guān)鍵字。然而,如果使用Call關(guān)鍵字調(diào)用要求參數(shù)的過程,則必須用括號(hào)將argumentlist括起來。如果省略Call關(guān)鍵字,那么必須也同時(shí)省略argumentlist參數(shù)兩邊的括號(hào)。使用Call語法調(diào)用內(nèi)部函數(shù)或使用用戶自定義函數(shù),函數(shù)返回值都會(huì)被放棄。
Call 語句的語法:
[Call ] name [argumentlist]
各組成部分的解釋見表3.3。
表3.3  Call 語句語法的組成部分:
組成部分      描述
Call      可選關(guān)鍵字。如果指定此關(guān)鍵字,則必須用括號(hào)把 argumentlist 括起來。
Name      必選。要調(diào)用的過程名。
Argumentlist      可選。傳遞給過程的變量、數(shù)組或表達(dá)式列表,用逗號(hào)分隔每一項(xiàng)。

3.2.4.2  Function語句
該語句用于聲明Function過程的名稱、參數(shù)以及構(gòu)成其主體的代碼。
如果在該語句中沒有明確指定使用Public或Private,則Function過程默認(rèn)為公用,即它們對(duì)于Script中的所有其他過程是可見和可用的。Function中局部變量的值在對(duì)過程的調(diào)用中不被保留。
此外,所有可執(zhí)行的代碼必須包含于過程中,用戶不能在另一個(gè)Function或Sub過程中定義Function過程。
使用Exit Function語句可以從Function過程中立即退出,而程序?qū)⒗^續(xù)執(zhí)行調(diào)用Function過程的語句之后的語句。用戶可在Function過程的任何位置出現(xiàn)任意個(gè)Exit Function語句。
與Sub過程類似,F(xiàn)unction過程是可以獲取參數(shù)、執(zhí)行一系列語句并改變其參數(shù)值的獨(dú)立過程。與Sub過程的不同之處是:當(dāng)要使用由函數(shù)返回的值時(shí),可以在表達(dá)式的右邊使用Function過程,這與內(nèi)部函數(shù)的使用方式一樣,例如Sqr、Cos或Chr。
在表達(dá)式中,可以通過使用函數(shù)名,并在其后用圓括號(hào)給出相應(yīng)的參數(shù)列表來調(diào)用Function過程。有關(guān)調(diào)用Function過程的詳細(xì)信息,請(qǐng)參閱Call語句。
需要注意的是,F(xiàn)unction過程可以是遞歸的,即該過程可以調(diào)用自身以完成某個(gè)給定的任務(wù)。但是,遞歸可能會(huì)導(dǎo)致堆棧溢出。
如要從函數(shù)返回一個(gè)值,則將值賦給函數(shù)名即可。在過程的任意位置都可以出現(xiàn)任意個(gè)這樣的賦值。如果沒有給name賦值,則過程將返回一個(gè)默認(rèn)值:數(shù)值函數(shù)返回0,字符串函數(shù)返回零長(zhǎng)度字符串(" ")。如果在Function中沒有對(duì)象引用被指定給name(使用Set),則返回對(duì)象引用的函數(shù)將返回Nothing。
在Function過程中使用的變量分為兩類:一類是在過程內(nèi)顯式聲明的,另一類則不是。在過程內(nèi)顯式聲明的變量(使用Dim或等效方法)總是過程的局部變量。被使用但沒有在過程中顯式聲明的變量也是局部變量,除非在該過程外更高級(jí)別的位置顯式聲明它們。
過程可以使用沒有在過程內(nèi)顯式聲明的變量,但如果在Script級(jí)中任何定義的名稱與之相同,則會(huì)發(fā)生名稱沖突。如果過程中使用的未聲明的變量與另一個(gè)過程、常量或變量的名稱相同,則會(huì)認(rèn)為過程使用的是Script級(jí)的名稱。顯式聲明變量可以避免這類沖突??梢允褂肙ption Explicit語句來強(qiáng)制顯式聲明變量。
VBScript可能會(huì)重新排列數(shù)學(xué)表達(dá)式以提高內(nèi)部效率。當(dāng)Function過程修改數(shù)學(xué)表達(dá)式中變量的值時(shí),應(yīng)避免在同一表達(dá)式中使用該函數(shù)。
Function語句的語法:
[Public | Private] Function name [(arglist)]
[statements]
[name = expression]
[Exit Function]
[statements]
[name = expression]
End Function

Function 語句的語法包含表3.4所示的各部分。
表3.4  Function 語句的語法組成
組成部分      說明
Public      表示Function過程可被所有Script中的所有其他過程訪問。
Private      表示Function過程只可被聲明它的Script中的其他過程訪問。
Name      Function的名稱,遵循標(biāo)準(zhǔn)的變量命名約定。
Arglist      代表調(diào)用時(shí)要傳遞給Function過程的參數(shù)的變量列表。用逗號(hào)隔開多個(gè)變量。
Statements      在Function過程的主體中執(zhí)行的任意語句組。
Expression      Function的返回值。

arglist參數(shù)包含下列語法和部分(表3.5):
[ByVal | ByRef] varname[( )]
表3.5  arglist語法的組成部分
組成部分      說  明
ByVal      表示該參數(shù)按值傳遞。
ByRef      表示該參數(shù)按引用傳遞。
Varname      代表參數(shù)變量的名稱;遵循標(biāo)準(zhǔn)的變量命名約定。

3.2.4.3  Sub語句
該語句用于聲明Sub過程的名稱、參數(shù)以及構(gòu)成其主體的代碼。
如果在定義Sub過程中,沒有明確指定使用Public或Private,則Sub過程默認(rèn)為公用,即它們對(duì)于Script中的所有其他過程都是可見的。
所有可執(zhí)行代碼必須包含于過程中。不能在另一個(gè)Sub或Function過程中定義一個(gè)Sub過程。
使用Exit Sub語句可以立即從Sub過程中退出。程序繼續(xù)執(zhí)行調(diào)用Sub過程的語句之后的語句??梢栽赟ub過程中任意位置出現(xiàn)任意個(gè)Exit Sub語句。
與Function過程相似之處是:Sub過程是一個(gè)可以獲取參數(shù),執(zhí)行一系列語句以及可改變其參數(shù)的值的獨(dú)立過程。而與Function過程不同之處是:Function過程可以返回值,而Sub過程不能用于表達(dá)式中。
可以使用過程名并跟隨相應(yīng)的參數(shù)列表來調(diào)用Sub過程。關(guān)于如何調(diào)用Sub過程的詳細(xì)說明信息,請(qǐng)參閱Call語句。
需要說明的是,Sub過程可以是遞歸的,即該過程可以調(diào)用自己來完成某個(gè)給定的任務(wù)。但是遞歸可能會(huì)導(dǎo)致堆棧溢出。
在Sub過程中使用的變量分為兩類:一類是在過程內(nèi)顯式聲明的,另一類則不是。在過程內(nèi)顯式聲明的變量(使用Dim或等效方法)總是局部變量。對(duì)于那些沒有在過程中顯式聲明的變量也是局部的,除非在該過程外更高級(jí)別的位置顯式地聲明它們。
另外,過程可以使用沒有在過程內(nèi)顯式聲明的變量,但只要有任何script級(jí)定義的名稱與之同名,就會(huì)產(chǎn)生名稱沖突。如果過程中引用的未聲明的變量與其他的過程、常量或變量的名稱相同,則會(huì)認(rèn)為過程引用的是Script級(jí)的名稱。顯式聲明變量可以避免這類沖突,使用Option Explicit語句可強(qiáng)制顯式聲明變量。
Sub語句的語法如下,組成見表3.6。
[Public | Private] Sub name [(arglist)]
[statements]
[Exit Sub]
[statements]
End Sub
表3.6  Sub 語句的語法的組成部分
組成部分      說明
Public      表示Sub過程可被所有Script中的所有其他過程訪問。
Private      表示Sub過程只可被聲明該過程的Script中的其他過程訪問。
Name      Sub的名稱,遵循標(biāo)準(zhǔn)變量命名約定。
arglist      代表在調(diào)用時(shí)要傳遞給Sub過程的參數(shù)的變量列表。用逗號(hào)隔開多個(gè)變量。
statements      在Sub過程主體內(nèi)所執(zhí)行的任何語句組。

arglist參數(shù)包含下列語法和部分(表3.7):
[ByVal | ByRef] varname[( )]
表3.7  arglist語法的組成部分
組成部分      說明
ByVal      表示該參數(shù)按值傳遞。
ByRef      表示該參數(shù)按引用傳遞。
varname      代表參數(shù)變量的名稱;遵循標(biāo)準(zhǔn)的變量命名約定。

3.3  綜合例子
學(xué)習(xí)了上述的基本語句和過程的使用方法,現(xiàn)在來看一個(gè)例子,以幫助大家對(duì)于已經(jīng)學(xué)習(xí)過的知識(shí)加深了解。
下面這個(gè)例子是可以允許用戶提供開始值和終止值,計(jì)算這些數(shù)值的連加或連乘;同時(shí)也允許用戶進(jìn)行頁面背景顏色的調(diào)整。
首先我們完成計(jì)算功能,在頁面上放置三個(gè)文本框,這三個(gè)文本框分別用于允許用戶填入開始數(shù)值,終止數(shù)值,以及返回顯示計(jì)算結(jié)果。再放置一個(gè)多行選擇列表框,可以選擇連加或是連乘的不同功能。三個(gè)文本框的名稱分別為:txtBegin,txtEnd,txtResult;列表框的名稱為:selectOption。所有的控件的屬性都采用默認(rèn)值。

<P>起始值:
     <INPUT id=txtBegin name=txtBegin
      style  ="HEIGHT: 22px; WIDTH: 60px">
        
     終止值:
     <INPUT id=txtEnd name=txtEnd
      style  ="HEIGHT: 22px; WIDTH: 60px">
</P>

<P>計(jì)算功能:</P>

<P>
     <SELECT id=selectOption name=selectOption
     size = 2 style="HEIGHT: 80px; WIDTH: 260px">
     </SELECT>
</P>

<P>計(jì)算結(jié)果:
     <INPUT id=txtResult name=txtResult>
</P>

下面的代碼可以對(duì)于列表框進(jìn)行初始化,使其具有兩個(gè)具體選項(xiàng),可供用戶選擇。

Sub InitOptionSelect
     Dim d
     Set d = CreateObject("Scripting.Dictionary")
     d.Add "0", "從起始值到終止值的連加"
     d.Add "1", "從起始值到終止值的連乘"
     
     Dim i
     Dim e
     For Each i in d
           Set e = Document.createElement("OPTION")
           e.Text = d.Item(i)
           e.Value = d.Item(i)
           frmFORM.selectOption.Options.Add e
     Next
     
End Sub

如果我們希望在每次選擇列表框中的選項(xiàng)時(shí),就能對(duì)輸入的開始數(shù)值和終止數(shù)值進(jìn)行計(jì)算,那么,就要將有關(guān)代碼寫在該列表的onChange事件函數(shù)中。

Sub selectOption_onChange
     Dim nBegin, nEnd, nResult
     nBegin = FilterNumber(frmFORM.txtBegin.value)
     nEnd = FilterNumber(frmFORM.txtEnd.value)
     
     
     Dim i
     i = nBegin
     if (frmFORM.selectOption.value = "從起始值到終止值的連加") Then
           nResult = 0
           For i = nBegin To nEnd
                 nResult = nResult + i
           Next
     Elseif (frmFORM.selectOption.value = "從起始值到終止值的連乘") Then
           nResult = 1
           For i = nBegin To nEnd
                 nResult = nResult * i
           Next
     End If
     frmFORM.txtResult.value = nResult
     
End Sub

再來看如何修改頁面的背景顏色,同樣先在頁面上放置一個(gè)下拉列表框,其屬性設(shè)為默認(rèn),名稱為SelectBkColor。

<P>選擇背景顏色:
     <SELECT id=selectBkColor name=selectBkColor
      style   ="HEIGHT: 22px; WIDTH: 110px">
     </SELECT>
</P>

進(jìn)行有關(guān)的下拉列表的初始化。在該列表中填入六個(gè)顏色值,可供用戶選擇。

Sub InitOptionSelect
     Dim d
     Set d = CreateObject("Scripting.Dictionary")
     d.Add "0", "從起始值到終止值的連加"
     d.Add "1", "從起始值到終止值的連乘"
     
     Dim i
     Dim e
     For Each i in d
           Set e = Document.createElement("OPTION")
           e.Text = d.Item(i)
           e.Value = d.Item(i)
           frmFORM.selectOption.Options.Add e
     Next
     
End Sub

修改顏色值的代碼也寫在下拉列表的onChange事件的過程中。

Sub InitColorSelect
     Dim d
     Set d = CreateObject("Scripting.Dictionary")
     d.Add "0", "紅色"
     d.Add "1", "綠色"
     d.Add "2", "藍(lán)色"
     d.Add "3", "黃色"
     d.Add "4", "藍(lán)綠"
     d.Add "5", "紫色"
     
     Dim i
     Dim e
     For Each i in d
           Set e = Document.createElement("OPTION")
           e.Text = d.Item(i)
           e.Value = d.Item(i)
           frmFORM.selectBkColor.Options.Add e
           frmFORM.selectBkColor.value = d.Item(i)
     Next
     
End Sub

這樣,我們就完成了所有的功能。如果讀者希望能進(jìn)一步改善該頁面的外觀,可以使用FrontPage98來進(jìn)行藝術(shù)性的美化,但網(wǎng)頁的主要功能已經(jīng)完成。
綜上所述,我們給出完整的程序清單如下:

<HTML>
<HEAD>
<META name=VI60_defaultClientScript content=VBScript>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>第四章節(jié)的一個(gè)例子:關(guān)于選擇語句和循環(huán)語句的使用</TITLE>
</HEAD>
<SCRIPT ID=clientEventHandlersVBS LANGUAGE=vbscript>
<!--
Sub InitColorSelect
     Dim d
     Set d = CreateObject("Scripting.Dictionary")
     d.Add "0", "紅色"
     d.Add "1", "綠色"
     d.Add "2", "藍(lán)色"
     d.Add "3", "黃色"
     d.Add "4", "藍(lán)綠"
     d.Add "5", "紫色"
     
     Dim i
     Dim e
     For Each i in d
           Set e = Document.createElement("OPTION")
           e.Text = d.Item(i)
           e.Value = d.Item(i)
           frmFORM.selectBkColor.Options.Add e
           frmFORM.selectBkColor.value = d.Item(i)
     Next
     
End Sub

Sub InitOptionSelect
     Dim d
     Set d = CreateObject("Scripting.Dictionary")
     d.Add "0", "從起始值到終止值的連加"
     d.Add "1", "從起始值到終止值的連乘"
     
     Dim i
     Dim e
     For Each i in d
           Set e = Document.createElement("OPTION")
           e.Text = d.Item(i)
           e.Value = d.Item(i)
           frmFORM.selectOption.Options.Add e
     Next
     
End Sub

Function FilterNumber(NumValue)
     If ( IsNumeric(NumValue) ) Then
           FilterNumber = NumValue
     else
           FilterNumber = 0
     End If
     
End Function

Sub selectBkColor_onchange
     Dim ColorValue
     Select Case frmFORM.selectBkColor.Value
     Case "紅色"
           ColorValue = RGB(255, 0, 0)
     Case "綠色"
           ColorValue = RGB(0, 255, 0)
     Case "藍(lán)色"
           ColorValue = RGB(0, 0, 255)
     Case "黃色"
           ColorValue = RGB(255, 255, 0)
     Case "藍(lán)綠"
           ColorValue = RGB(0, 255, 255)
     Case "紫色"
           ColorValue = RGB(255, 0, 255)
     End Select
     
     document.bgColor = ColorValue
     
End Sub

Sub selectOption_onChange
     Dim nBegin, nEnd, nResult
     nBegin = FilterNumber(frmFORM.txtBegin.value)
     nEnd = FilterNumber(frmFORM.txtEnd.value)
     
     
     Dim i
     i = nBegin
     if (frmFORM.selectOption.value = "從起始值到終止值的連加") Then
           nResult = 0
           For i = nBegin To nEnd
                 nResult = nResult + i
           Next
     Elseif (frmFORM.selectOption.value = "從起始值到終止值的連乘") Then
           nResult = 1
           For i = nBegin To nEnd
                 nResult = nResult * i
           Next
     End If
     frmFORM.txtResult.value = nResult
     
End Sub
           
-->
</SCRIPT>

<BODY bgColor=moccasin>
<FORM NAME = "frmFORM">
<P>選擇背景顏色:
     <SELECT id=selectBkColor name=selectBkColor
      style   ="HEIGHT: 22px; WIDTH: 110px">
     </SELECT>
</P>

<P>起始值:
     <INPUT id=txtBegin name=txtBegin
      style  ="HEIGHT: 22px; WIDTH: 60px">
        
     終止值:
     <INPUT id=txtEnd name=txtEnd
      style  ="HEIGHT: 22px; WIDTH: 60px">
</P>

<P>計(jì)算功能:</P>

<P>
     <SELECT id=selectOption name=selectOption
     size = 2 style="HEIGHT: 80px; WIDTH: 260px">
     </SELECT>
</P>
<P>計(jì)算結(jié)果:
     <INPUT id=txtResult name=txtResult>
</P>
<SCRIPT LANGUAGE=vbscript>
<!--
InitColorSelect
InitOptionSelect
-->
</SCRIPT>
</FORM>
</BODY>
</HTML>



dyle_gg,2004-12-02 14:17:21

第4章  VBScript的函數(shù)
我們已經(jīng)對(duì)VBScript的基本知識(shí)有所了解,本章我們將進(jìn)一步學(xué)習(xí)VBScript的各類函數(shù)。由于學(xué)習(xí)抽象的函數(shù)知識(shí)近似于學(xué)習(xí)理論知識(shí),會(huì)讓人感到十分的枯燥和乏味,所以在這一章中,我們先從總體上對(duì)VBScript的函數(shù)作一綜合介紹,然后再通過一些典型的例子,來詳細(xì)講解較常用到的VBScript函數(shù)。
4.1  VBScript函數(shù)綜述
在VBScript中,函數(shù)包含在Function和End Function之間,函數(shù)和過程有許多相同之處,同樣可以獲取一定的參數(shù),執(zhí)行一系列的語句,并完成一定的操作,但和過程不同之處在于,函數(shù)會(huì)有一個(gè)返回值,其語法如下所示:
Public|Private Function name [(argulist)]
   statements
   name = expression
End Function
和過程一樣,使用Private和Public可以表示函數(shù)是是公有的還是私有的,缺省情況下,函數(shù)默認(rèn)是公有的。name是函數(shù)的名稱,其命名需要遵循VBScript關(guān)于變量命名的規(guī)定。argulist是函數(shù)的參數(shù)列表,多個(gè)參數(shù)之間通過逗號(hào)進(jìn)行分隔,參數(shù)傳遞有兩種傳遞方式:ByVal進(jìn)行值傳遞、ByRef進(jìn)行地址傳遞。statements是函數(shù)內(nèi)執(zhí)行的腳本。
name=expression語句則將expression的結(jié)果返回給調(diào)用該函數(shù)的語句,其中返回的結(jié)果數(shù)據(jù)類型是Variant類型。
如果需要在函數(shù)執(zhí)行的過程中,滿足某種條件后直接退出函數(shù)的處理邏輯,返回主程序,應(yīng)該使用Exit Function語句。
例如,我們可以編寫函數(shù)完成將溫度的華氏度換算為攝氏度,如下所示:

<!--
Function CDegree(ByVal fDegree)
   CDegree = (fDegree – 32) * 5 /9
End Function
-->

然后我們可以調(diào)用這個(gè)函數(shù)進(jìn)行獲取華氏溫度相應(yīng)的攝氏溫度,在下面的語句,我們將華氏100度進(jìn)行轉(zhuǎn)換:

<!--
Temperature = CDegree(100)
-->

VBScript提供的函數(shù)通常稱為內(nèi)部函數(shù),以與用戶定義的函數(shù)即外部函數(shù)相區(qū)分。這些內(nèi)部函數(shù)可以完成數(shù)學(xué)運(yùn)算、數(shù)據(jù)子類型的轉(zhuǎn)換、數(shù)據(jù)格式化等操作。我們可以在腳本中直接調(diào)用這些函數(shù)完成數(shù)據(jù)處理而不需要任何預(yù)先的聲明。下面,我們就對(duì)這些函數(shù)綜合起來進(jìn)行簡(jiǎn)要的介紹。
4.1.1  數(shù)據(jù)類型判斷
VBScript中只有一種數(shù)據(jù)類型Variant,數(shù)據(jù)類型判斷函數(shù)可以判斷變量的子類型,運(yùn)用這些函數(shù),我們能夠根據(jù)變量的子類型,對(duì)變量進(jìn)行合適的處理:
1. IsArray:IsArray函數(shù)判斷變量是否是一個(gè)數(shù)組,如果是數(shù)組,則返回True,否則返回False。
2. IsDate:IsDate函數(shù)判斷表達(dá)式是否能夠轉(zhuǎn)換為日期,如果能夠轉(zhuǎn)換,則返回True,否則返回False。例如,如果變量Today = “12-30-2000”,那么使用IsDate(Today)的返回值為True。
3. IsEmpty:IsEmpty函數(shù)用于指明變量是否已經(jīng)被初始化,在聲明變量之后,變量將自動(dòng)被賦值為Empty,這時(shí)候使用IsEmpty判斷,返回值為True;當(dāng)變量經(jīng)過賦值操作之后,調(diào)用IsEmpty函數(shù),則返回False。
4. IsNull:IsNull函數(shù)可以判斷變量中存儲(chǔ)的是否為Null,如果為Null,返回值為True,否則返回值為False。
需要說明的是,Null并不是0,也不是空字符串,而是代表無效數(shù)據(jù)。
5. IsNumeric:IsNumeric函數(shù)指明表達(dá)式是否能夠被轉(zhuǎn)換為數(shù)字表達(dá)式,如果轉(zhuǎn)換能成功,則返回True,否則返回False。例如,如果字符串Num = “31.24”,那么IsNumeric(Num)的返回值為True。
6. IsObject:IsObject函數(shù)可以判斷變量是否是ActiveX對(duì)象,如是ActiveX對(duì)象則返回True,否則返回False。
7. TypeName和VarType:TypeName和VarType函數(shù)都能夠返回變量的子類型,不同的是,TypeName返回的是一個(gè)指示變量子類型的字符串,而VarType返回的是指示變量子類型的數(shù)字。
4.1.2  格式化函數(shù)
VBScript中引入了格式化函數(shù),這些函數(shù)可以對(duì)貨幣類型數(shù)據(jù)、時(shí)間類型數(shù)據(jù)、數(shù)字和百分比數(shù)值等進(jìn)行格式轉(zhuǎn)換和處理,這些處理是基于控制面板中的區(qū)域設(shè)置屬性完成的。
1. FormatCurrency:FormatCurrency函數(shù)返回格式化后的貨幣類型數(shù)值,貨幣符號(hào)的設(shè)置基于控制面板的區(qū)域?qū)傩栽O(shè)置中。其語法如下所示:
formatCurrency(expression[,NumDigitsAfterDecimal[,IncludeLeadingDigit[,UseParensForNegativeNumbers[,GroupDigits]]]])
其中,expression代表將被格式化的表達(dá)式,NumDigitsAfterDecimal代表的是小數(shù)點(diǎn)后數(shù)字位數(shù),IncludeLeadingDigit指示是否將顯示數(shù)字前面的零,UseParensForNegativeNumbers指示是否使用括號(hào)代替負(fù)號(hào),GroupDigits指示是否使用區(qū)域設(shè)置中指定的數(shù)字分組符號(hào)將數(shù)字分組。其信息來源是控制面板中區(qū)域設(shè)置屬性的貨幣部分,其中,后面三個(gè)參數(shù)可以有以下取值:
(1) TristateTrue,代表選項(xiàng)值為True;
(2) TristateFalse,代表選項(xiàng)值為False;
(3) TristateUseDefault,代表根據(jù)控制面板中的區(qū)域設(shè)置來進(jìn)行處理。
例如,我們可以將以下貨幣-12345.78進(jìn)行格式化顯示:
FormatCurrency(-12345.78, 1, TristateTrue, TristateTrue, TristateTrue)
函數(shù)的可能返回值是-¥12345.8。
2. FormatDateTime:運(yùn)用FormatDateTime函數(shù),可以用5種日期/時(shí)間格式來顯示一個(gè)日期表達(dá)式,其語法如下所示:
FormatDateTime(Date [,NamedFormat])
其中,Date是將要格式化的日期表達(dá)式,NamedFormat是指示日期/時(shí)間格式的值,它可以有以下5種取值:
(1) vbGeneralDate,如果表達(dá)式中只有日期部分,則顯示為短日期格式,如果表達(dá)式中只有時(shí)間部分,則顯示為長(zhǎng)時(shí)間格式,如果兩部分都存在,則全部顯示;
(2) vbLongDate,根據(jù)區(qū)域設(shè)置屬性以長(zhǎng)日期格式顯示日期;
(3) vbShortDate,根據(jù)區(qū)域設(shè)置屬性以短日期格式顯示日期;
(4) vbLongTime,根據(jù)區(qū)域設(shè)置屬性以長(zhǎng)時(shí)間格式顯示時(shí)間;
(5) vbShortTime,根據(jù)區(qū)域設(shè)置屬性以短時(shí)間格式顯示時(shí)間。
例如,我們可以在以下腳本中將2000年12月20日以長(zhǎng)日期格式顯示:
FormatDateTime(“2000/12/20”, vbLongDate)
不過,上述語句在不同的計(jì)算機(jī)上可能運(yùn)行會(huì)得出不同的結(jié)果,因?yàn)樵诳刂泼姘逯械膮^(qū)域設(shè)置屬性可能會(huì)各不相同。如果長(zhǎng)日期樣式設(shè)置為yyyy‘年’M‘月’d‘日’,那么,上述語句返回的結(jié)果將是2000年12月20日。
3. FormatNumber:FormatNumber函數(shù)可以用于一個(gè)數(shù)字表達(dá)式的自定義顯示,其語法如下所示:
FormatNumber(expression[,NumDigitsAfterDecimal[,IncludeLeadingDigit[,UseParensForNegativeNumbers[,GroupDigits]]]])
其中的參數(shù)和FormatCurrency完全相同,不同的是它所有的信息均來自控制面板中區(qū)域設(shè)置屬性的數(shù)字部分。
例如,F(xiàn)ormatNumber(-12.3456, 2, TristateFalse, TristateFalse, TristateFalse)的可能反饋結(jié)果是-12.35。
4. FormatPercent:FormatPercent函數(shù)用于返回一個(gè)表達(dá)式的百分比數(shù)值,其語法如下所示:
FormatPercent(expression[,NumDigitsAfterDecimal[,IncludeLeadingDigit[,UseParensForNegativeNumbers[,GroupDigits]]]])
其中參數(shù)和FormatCurrency完全相同,不同之處在于它的信息均來自控制面板中區(qū)域設(shè)置屬性的數(shù)字部分。
例如,F(xiàn)ormatPercent(-12.3456, 2, TristateFalse, TristateFalse, TristateFalse)的可能反饋結(jié)果是-1234.56%。
4.1.3  數(shù)據(jù)類型轉(zhuǎn)換函數(shù)
運(yùn)用VBScript的數(shù)據(jù)類型轉(zhuǎn)換函數(shù),我們可以方便地把數(shù)據(jù)進(jìn)行子類型的轉(zhuǎn)換,可以將字符串轉(zhuǎn)換為日期,也可以將數(shù)字轉(zhuǎn)換為字符串等等。
1. CBool:CBool函數(shù)將表達(dá)式轉(zhuǎn)換為布爾子類型的數(shù)據(jù)。
2. CByte:CByte函數(shù)將表達(dá)式轉(zhuǎn)換為字節(jié)子類型的數(shù)據(jù),例如,CByte(“12”)=12。
3. CCur:CCur函數(shù)將表達(dá)式轉(zhuǎn)換為貨幣子類型的數(shù)據(jù)。
4. CDate:CDate函數(shù)將表達(dá)式轉(zhuǎn)換為日期子類型的數(shù)據(jù)。
5. CDbl:CDbl函數(shù)將表達(dá)式轉(zhuǎn)換為雙精度浮點(diǎn)子類型的數(shù)據(jù)。
6. CInt:CInt函數(shù)將表達(dá)式轉(zhuǎn)換為整數(shù)類型的數(shù)據(jù)。
7. CSng:CSng函數(shù)將表達(dá)式轉(zhuǎn)換為單精度浮點(diǎn)子類型的數(shù)據(jù)。
8. CStr:CStr函數(shù)將表達(dá)式轉(zhuǎn)換為字符串子類型的數(shù)據(jù)。例如,CStr(12.34)=“12.34”。
9. Hex:Hex函數(shù)將數(shù)值轉(zhuǎn)換為表示十六進(jìn)制值的字符串,例如,Hex(31)=“1F”。
10. Oct:Oct函數(shù)將數(shù)值轉(zhuǎn)換為表示八進(jìn)制值的字符串,例如,Oct(31)=“37”。
當(dāng)然,在上述類型轉(zhuǎn)換中并不能無限制地進(jìn)行類型轉(zhuǎn)換,比如說,CDate類型轉(zhuǎn)換的表達(dá)式必須是能夠被識(shí)別為日期子類型的表達(dá)式,比如說,如果執(zhí)行CDate(“nothing”)函數(shù),那么將會(huì)返回類型不匹配的錯(cuò)誤。
4.1.4  數(shù)學(xué)運(yùn)算函數(shù)
VBScript還提供了一定的數(shù)學(xué)運(yùn)算函數(shù),可以完成簡(jiǎn)單的數(shù)學(xué)運(yùn)算功能,當(dāng)然,由于VBScript的主要應(yīng)用并不在數(shù)學(xué)運(yùn)算中,所以其數(shù)學(xué)運(yùn)算功能并不是十分強(qiáng)大,不過靈活運(yùn)用這些函數(shù)也能夠極大地方便我們腳本開發(fā):
1. Atn:Atn函數(shù)用于計(jì)算數(shù)值的反正切值。
2. Cos:Cos函數(shù)用于計(jì)算角度的余弦值。
3. Sin:Sin函數(shù)用于計(jì)算角度的正弦值。
4. Tan:Tan函數(shù)用于計(jì)算角度的正切值,在這些計(jì)算角度的函數(shù)中,角度的表達(dá)形式應(yīng)該是弧度,例如,計(jì)算30°的正切值,我們需要使用如下方式:Tan(30*3.1415927/180)。
5. Exp:Exp函數(shù)用于計(jì)算自然指數(shù)的冪次。
6. Log:Log函數(shù)用于計(jì)算數(shù)值的自然對(duì)數(shù)。
7. Sqr:Sqr函數(shù)用于計(jì)算數(shù)值的平方根。
8. Randomize:Randomize函數(shù)用于初始化隨機(jī)數(shù)生成器。在VBScript中,生成的隨機(jī)數(shù)并不是真正意義上的隨機(jī)數(shù),而是偽隨機(jī)序列,在生成第一個(gè)隨機(jī)數(shù)的時(shí)候,它需要一個(gè)數(shù)值作為種子值來生成偽隨機(jī)序列。Randomize函數(shù)有一個(gè)參數(shù)number,Randomize函數(shù)執(zhí)行后可以初始化Rnd函數(shù)的隨機(jī)數(shù)生成器,并以number作為其種子值,如果函數(shù)省略number,則缺省使用系統(tǒng)計(jì)時(shí)器返回的值作為種子值。
注意,如果不使用Randomize函數(shù),則第一次調(diào)用Rnd函數(shù)的時(shí)候,它將使用相同的數(shù)字作為種子值,這樣就不能起到生成隨機(jī)數(shù)的作用了。
9. Rnd:Rnd函數(shù)用于生成一個(gè)隨機(jī)數(shù),這個(gè)隨機(jī)數(shù)是一個(gè)小于1但大于等于0的小數(shù)。Rnd函數(shù)也有一個(gè)參數(shù)number,如果number大于0,則返回偽隨機(jī)序列中的下一個(gè)數(shù)值,如果number小于0,則每次都會(huì)返回以number為種子值的隨機(jī)數(shù),如果number等于0,則返回最近生成的數(shù)。例如,如果我們需要生成一個(gè)5到10之間的隨機(jī)數(shù),我們可以采用如下公式:
Int((10 – 5 + 1) * Rnd + 5)
10. Abs:Abs返回?cái)?shù)值表達(dá)式的絕對(duì)值。
11. Int:Int函數(shù)返回?cái)?shù)值表達(dá)式的整數(shù)部分。
12. Fix:Fix函數(shù)同樣返回?cái)?shù)值表達(dá)式的整數(shù)部分,如果數(shù)值表達(dá)式結(jié)果大于等于0,則Int函數(shù)和Fix函數(shù)并沒有什么區(qū)別,同樣返回其整數(shù)部分,如果數(shù)值表達(dá)式結(jié)果小于0,則Int函數(shù)返回的是小于或等于這個(gè)數(shù)值的第一個(gè)負(fù)整數(shù),而Fix函數(shù)返回的是大于或等于這個(gè)數(shù)值的第一個(gè)負(fù)整數(shù),例如,Int(-2.4)=-3,而Fix(-2.4)=-2。
13. Round:Round函數(shù)對(duì)數(shù)值表達(dá)式進(jìn)行四舍五入取整。
14. Sgn:Sgn函數(shù)返回代表數(shù)值表達(dá)式的整數(shù),如果數(shù)值表達(dá)式的值大于0,則返回1,如果等于0,則返回0,如果小于0,則返回-1。
4.1.4  日期時(shí)間處理函數(shù)
VBScript的日期時(shí)間處理函數(shù)能夠獲取當(dāng)前系統(tǒng)的日期和時(shí)間,也能夠?qū)θ掌诤蜁r(shí)間中的各個(gè)部分單獨(dú)取出進(jìn)行處理:
1. Date:Date函數(shù)返回當(dāng)前系統(tǒng)日期。
2. Time:Time函數(shù)返回當(dāng)前系統(tǒng)時(shí)間。
3. DateAdd:DateAdd函數(shù)能夠?qū)⒔o定日期添加時(shí)間間隔然后返回,其語法如下所示:
DateAdd(interval, number, date)
其中,interval是表示時(shí)間間隔部分的字符串,其取值可以是:“yyyy”,代表年份;“q”,代表季度;“m”,代表月份;“y”,代表一年的日數(shù);“d”,代表日;“w”,代表一周的日數(shù);“ww”,代表周;“h”,代表小時(shí);“n”,代表分鐘;“s”,代表秒。number是需要添加的時(shí)間間隔,date則是給定的日期。例如,我們可以獲取當(dāng)前日期的100天后的日期:
DateAdd(“y”, 100, Date)
4. DateDiff:DateDiff函數(shù)能夠返回兩個(gè)給定日期之間的差異,其語法如下所示:
DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
其中,interval是表示時(shí)間間隔部分的字符串,取值和DateAdd函數(shù)一樣,date1和date2分別代表開始日期和結(jié)束日期,firstdayofweek可以指定哪一天是一個(gè)星期的開始,其取值如表4.1所示:
表4.1  firstdayofweek參數(shù)取值
常數(shù)      取值      說明
vbUseSystem      0      根據(jù)區(qū)域?qū)傩栽O(shè)置而定
vbSunday      1      星期天(默認(rèn)設(shè)置)
vbMonday      2      星期一
vbTuesday      3      星期二
vbWednesday      4      星期三
vbThursday      5      星期四
vbFriday      6      星期五
vbSaturday      7      星期六

firstweekofyear可以指定一年中第一周的情況,其取值如表4.2所示:
表4.2  firstweekofyear參數(shù)取值
常數(shù)      取值      說明
vbUseSystem      0      根據(jù)區(qū)域設(shè)置屬性而定
vbFirstJan1      1      從1月1日所在的星期開始(默認(rèn))
vbFirstFourDays      2      新年中至少有四天的第一個(gè)星期開始
vbFirstFullWeek      3      新年中完整的第一個(gè)星期開始

firstdayofweek和firstweekofyear這兩個(gè)參數(shù)都是可選的。例如,我們可以計(jì)算1999年12月31日和2000年12月31日間相差的天數(shù):DateDiff(“d”, “1999/12/31”, “2000/12/31”)=366,也可以計(jì)算相差年份:DateDiff(“yyyy”, “1999/12/31”, “2000/12/31”)=1。
5. DatePart:DatePart函數(shù)可以返回日期的指定部分,其語法如下所示:
DatePart(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
其中參數(shù)和DateDiff函數(shù)的參數(shù)完全相同。例如,我們可以獲知2000年5月26日是星期幾:DatePart(“w”, “2000/5/26”)=6,6代表的正是vbFriday常數(shù),表明這一天是星期五。
6. DateSerial:給定年、月和日各部分,DateSerial函數(shù)可以將其合成為日期子類型的數(shù)據(jù)。例如對(duì)于2000年12月31日,我們可以使用DateSerial函數(shù)如下合成:DateSerial(2000, 12, 31)。
7. DateValue:運(yùn)用DateValue函數(shù),能夠?qū)⒂靡悦枋鋈掌诘淖址D(zhuǎn)化成為日期子類型的數(shù)據(jù),其中包含的就是字符串所描述的日期。
8. Day:Day函數(shù)返回指定日期的日部分。例如,可以獲取當(dāng)前日期的日部分:Day(Date)。
9. Month:Month函數(shù)返回指定日期的月份部分。
10. Year:Year函數(shù)返回指定日期的年份部分。
11. MonthName:MonthName返回代表指定月份的字符串,例如,MonthName(1)=“一月”,這個(gè)返回值是和系統(tǒng)相關(guān)的。
12. WeekDay:WeekDay函數(shù)可以返回指定日期是星期幾,例如,WeekDay(Now)函數(shù)可以獲取系統(tǒng)當(dāng)前日期是星期幾。
13. WeekDayName:WeekDayName函數(shù)可以返回一個(gè)字符傳,指定星期中的某一天。
14. Hour:Hour函數(shù)返回指定時(shí)間的小時(shí)部分。例如,可以獲取當(dāng)前時(shí)間的小時(shí)部分:Hour(Time)。
15. Minute:Minute函數(shù)返回指定時(shí)間的分鐘部分。
16. Second:Second函數(shù)返回指定時(shí)間的秒鐘部分。
17. Now:Now函數(shù)獲取當(dāng)前系統(tǒng)日期和時(shí)間值。
18. TimeSerial:給定小時(shí)、分鐘和秒鐘,TimeSerial函數(shù)可以將其合成為日期子類型的數(shù)據(jù)。例如對(duì)于11點(diǎn)59分59秒,我們可以使用TimeSerial函數(shù)如下合成:TimeSerial(11, 59, 59)。
19. TimeValue:運(yùn)用TimeValue函數(shù),能夠?qū)⒂靡悦枋鰰r(shí)間的字符串轉(zhuǎn)化成為日期子類型的數(shù)據(jù),其中包含的就是字符串所描述的時(shí)間。
4.1.5  字符串處理函數(shù)
VBScript中字符串處理函數(shù)可以完成截取字符串、字符串大小寫轉(zhuǎn)換等功能,雖然我們完全可以自己編寫腳本來實(shí)現(xiàn)同樣的功能,但是直接調(diào)用VBScript的函數(shù)可以在腳本編寫的過程中提供給我們不少方便。
1. Asc:Asc函數(shù)可以獲取字符串中第一個(gè)字母的ASCII碼,例如,Asc(“AB”)=65。
2. Chr:Chr函數(shù)可以返回指定數(shù)字對(duì)應(yīng)的ASCII碼字符,例如,Chr(65)=“A”。
3. Instr:運(yùn)用Instr函數(shù),我們可以判斷在一個(gè)字符串中是否包含另外一個(gè)字符串,它返回的是被搜索字符串第一次出現(xiàn)的位置,例如,Instr(“acabc”, “ab”)=3。
4. InstrRev;InstrRev函數(shù)的功能和Instr的功能類似,不同之處在于InstrRev函數(shù)是從字符串尾開始搜索,而Instr函數(shù)是從字符串首開始搜索,例如,Instr(“acabc”, “c”)=2,而InstrRev(“acabc”, “c”)=5。
5. Len:Len函數(shù)返回字符串的長(zhǎng)度,例如,Len(“abc”)=3。
6. LCase:LCase函數(shù)將字符串中的字母轉(zhuǎn)換為小寫字符,例如,LCase(“Case”)=“case”。
7. UCase:UCase函數(shù)和LCase函數(shù)的功能正好相反,UCase函數(shù)將字符串中的字母轉(zhuǎn)換為大寫字符,例如,UCase(“Case”)=“CASE”。
8. Left:Left函數(shù)可以從字符串左邊開始截取指定長(zhǎng)度的字符,例如,Left(“Case”, 2)=“Ca”。
9. Right:Right函數(shù)可以從字符串右邊開始截取指定長(zhǎng)度的字符,例如,Right(“Case”, 2)=“se”。
10. Mid:Mid函數(shù)的功能比Left函數(shù)和Right函數(shù)的功能要強(qiáng)大得多,它能夠從字符串的指定位置截取指定長(zhǎng)度的字符,例如,我們可以截取“Case”字符串從第二個(gè)位置開始的兩個(gè)字符:Mid(“Case”, 2, 2)=“as”。
11. LTrim、RTrim和Trim:LTrim函數(shù)刪除字符串中的前導(dǎo)空格,RTrim函數(shù)刪除字符串中的后續(xù)空格,Trim函數(shù)則刪除字符串中的前導(dǎo)和后續(xù)空格,例如,LTrim(“ Case ”)=“Case ”,RTrim(“ Case ”)=“ Case”,Trim(“ Case ”)=“Case”。
12. StrReverse:StrReverse函數(shù)將指定的字符串一逆序的形式排列,例如,StrReverse(“Case”)=”esaC”。
13. String:String函數(shù)返回指定長(zhǎng)度并以相同字符組成的字符串,例如,我們可以生成一個(gè)長(zhǎng)度為5,并且全部由字符a組成的字符串:String(5, “a”)=“aaaaa”。
14. StrComp:StrComp函數(shù)對(duì)兩個(gè)字符串執(zhí)行字符串比較,并返回比較結(jié)果,如果前者小于后者返回-1,如果前者大于后者返回1,如果兩個(gè)字符串相等返回0,如果兩個(gè)字符串中有一個(gè)字符串為Null,則返回Null。例如,StrComp(“good”, “ok”)=-1,這是因?yàn)?#8220;g”的ASCII碼小于“o”的ASCII碼,所以“good”<“ok”。
15. Space:Space函數(shù)返回由指定空格組成的字符串,例如,Space(2)=“  ”。
16. Replace:Replace函數(shù)可以將字符串中指定的子串替換為另外的子串,例如,我們可以將字符串“window”中的w替換為k,Replace(“window”, “w”, “k”)=“kindok”。
4.2  程序范例:Hello
幾乎所有介紹編程語言的書上的第一個(gè)范例都是Hello, world。所以,我在這里也使用Hello作為VBScript函數(shù)學(xué)習(xí)的第一個(gè)范例。這是一個(gè)簡(jiǎn)單的程序,通過這個(gè)程序的學(xué)習(xí),可以對(duì)于MsgBox函數(shù)有所了解。
4.2.1  范例介紹
使用瀏覽器(這里使用IE)將該網(wǎng)頁打開后如圖4.1所示。
 
圖4.1  VBScript程序范例:Hello
用戶可以單擊“問好”按鈕,將彈出一個(gè)對(duì)話框。僅此而已,相當(dāng)簡(jiǎn)單。這個(gè)程序的源代碼也相當(dāng)簡(jiǎn)單,僅幾句話而已:

<SCRIPT LANGUAGE="VBScript">
<!—
Sub BtnHello_OnClick
     MsgBox "嗨,你好!", 0, "第一個(gè)程序"
End Sub
-->
</SCRIPT>

從上述代碼中可以看出,在按鈕單擊事件中只有一行代碼,在這行代碼中使用了MsgBox函數(shù)。該函數(shù)的作用是將彈出一個(gè)對(duì)話框,對(duì)話框中可以寫一些用戶想要表示的信息。這個(gè)方法雖然簡(jiǎn)單,但相當(dāng)有用。
4.2.2  函數(shù)介紹——MsgBox函數(shù)
MsgBox函數(shù)用于彈出一個(gè)對(duì)話框,并在對(duì)話框中顯示一些用戶信息,并等待用戶單擊按鈕。該函數(shù)的返回值用于表示用戶單擊的按鈕。
關(guān)于該函數(shù)的語法如下:
MsgBox (prompt[, buttons][, title][, helpfile, context])

關(guān)于該函數(shù)中的一些參數(shù)的說明如下:
(1) Prompt。作為消息顯示在對(duì)話框中的字符串表達(dá)式。prompt 的最大長(zhǎng)度大約是1024個(gè)字符,這取決于所使用的字符的寬度。如果 prompt 中包含多個(gè)行,則可在各行之間用回車符 (Chr(13))、換行符 (Chr(10)) 或回車換行符的組合 (Chr(13) & Chr(10)) 分隔各行。
(2) Buttons。數(shù)值表達(dá)式,是表示指定顯示按鈕的數(shù)目和類型、使用的圖標(biāo)樣式,默認(rèn)按鈕的標(biāo)識(shí)以及消息框樣式的數(shù)值的總和。有關(guān)數(shù)值,請(qǐng)參閱下文。如果省略,則 buttons 的默認(rèn)值為 0。
(3) Title。顯示在對(duì)話框標(biāo)題欄中的字符串表達(dá)式。如果省略 title,則將應(yīng)用程序的名稱顯示在標(biāo)題欄中。
(4) Helpfile。字符串表達(dá)式,用于標(biāo)識(shí)為對(duì)話框提供上下文相關(guān)幫助的幫助文件。如果已提供 helpfile,則必須提供 context。在 16 位系統(tǒng)平臺(tái)上不可用。
(5) Context。數(shù)值表達(dá)式,用于標(biāo)識(shí)由幫助文件的作者指定給某個(gè)幫助主題的上下文編號(hào)。如果已提供 context,則必須提供 helpfile。在 16 位系統(tǒng)平臺(tái)上不可用。
Helpfile和Context兩個(gè)參數(shù)必須同時(shí)出現(xiàn),這樣用戶就可以按下F1鍵來查看與上下文相對(duì)應(yīng)的幫助主題。如果對(duì)話框顯示“取消”按鈕,則按ESC鍵與單擊“取消”按鈕的效果相同。如果對(duì)話框包含“幫助”按鈕,則有為對(duì)話框提供的上下文相關(guān)幫助。
此外對(duì)于參數(shù)Button,這里還需要說明一下。在VBScript語言中,提供了一些常量來代替Button中枯燥而且沒有任何意義的數(shù)值表達(dá)式,下面我們就介紹一下這些組常量。
第一組常量用于描述對(duì)話框中顯示的按鈕類型與數(shù)目(表4.3):
表4.3  常量表示
常量表示      代表數(shù)值      含義
vbOKOnly      0      只顯示確定按鈕。
vbOKCancel      1      顯示確定和取消按鈕。
vbAbortRetryIgnore      2      顯示放棄、重試和忽略按鈕。
vbYesNoCancel      3      顯示是、否和取消按鈕。
vbYesNo      4      顯示是和否按鈕。
vbRetryCancel      5      顯示重試和取消按鈕。

第二組常量用于描述圖標(biāo)的樣式(表4.4):
表4.4  常量表示
常量表示      代表數(shù)值      含義
vbCritical      16      顯示臨界信息圖標(biāo)。
vbQuestion      32      顯示警告查詢圖標(biāo)。
vbExclamation      48      顯示警告消息圖標(biāo)。
vbInformation      64      顯示信息消息圖標(biāo)。

第三組常量用于確定默認(rèn)按鈕,如表4.5所示。
表4.5  常量表示
常量表示      代表數(shù)值      含義
vbDefaultButton1      0      第一個(gè)按鈕為默認(rèn)按鈕。
vbDefaultButton2      256      第二個(gè)按鈕為默認(rèn)按鈕。
vbDefaultButton3      512      第三個(gè)按鈕為默認(rèn)按鈕。
vbDefaultButton4      768      第四個(gè)按鈕為默認(rèn)按鈕。

第四組常量用于決定消息框的樣式,如表4.6所示。
表4.6  常量表示
常量表示      代表數(shù)值      含義
vbApplicationModal      0      應(yīng)用程序模式:用戶必須響應(yīng)消息框才能繼續(xù)在當(dāng)前應(yīng)用程序中工作。
vbSystemModal      4096      系統(tǒng)模式:在用戶響應(yīng)消息框前,所有應(yīng)用程序都被掛起。

在使用buttons 參數(shù)值時(shí),只需要從每組值中取用一個(gè)數(shù)字或常量來表示按鈕即可。
MsgBox函數(shù)的返回值也是一些數(shù)值信息,而且是通用的。同時(shí),這些返回值也可以用一定的常量來表示其具體的含義,具體如表4.7所示。
表4.7  常量表示
常量表示      代表數(shù)值      含義
vbOK      1      確定
vbCancel      2      取消
vbAbort      3      放棄
vbRetry      4      重試
vbIgnore      5      忽略
vbYes      6      是
vbNo      7      否
4.2.3  程序清單
<SCRIPT LANGUAGE="VBScript">     
<!--     
     Sub BtnHello_OnClick     
           MsgBox "嗨,你好!", 0, "第一個(gè)程序"     
     End Sub     
-->     
</SCRIPT>    
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ASP動(dòng)態(tài)網(wǎng)頁設(shè)計(jì)試題
歡迎光臨 VBScript 語言參考
第三章 VB語言基礎(chǔ)_Visual Basic基礎(chǔ)_
第三章 VB的程序設(shè)計(jì)基礎(chǔ)
JavaScript權(quán)威指南第6版
JavaScript中的運(yùn)算符和語句
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服