VBScript 僅支援單一資料類型 —— Variant (變體),但 Variant 內部可依據內容自動切換多種子類型,彈性極高。理解 Variant 運作機制、變數宣告規則與陣列操作,是撰寫健壯 ASP 程式的基石。
Variant 子類型完整表
| 子類型 | 說明 | 範圍/範例 |
| Boolean | 布林值 | True / False |
| Byte | 無號位元組 | 0 ~ 255 |
| Currency | 貨幣型(定點 4 位小數) | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
| Date | 日期時間 | 西元 100/1/1 ~ 9999/12/31 |
| Double | 雙精度浮點數 | ±4.94E-324 ~ ±1.79E308 |
| Empty | 未初始化 | 變數宣告未賦值 |
| Error | 錯誤代碼 | Err.Number 等 |
| Integer | 16 位整數 | -32,768 ~ 32,767 |
| Long | 32 位整數 | -2,147,483,648 ~ 2,147,483,647 |
| Null | 無效值 | 資料庫 NULL、明確指派 Null |
| Object | 物件參考 | CreateObject 回傳 |
| Single | 單精度浮點數 | ±1.40E-45 ~ ±3.40E38 |
| String | 可變長字串 | 最長約 20 億字元 |
自動轉型規則:數字語境視為數字、字串語境視為字串;引號括起的數字視為字串("123")。
變數命名規則
- 首字必為字母 (A-Z, a-z)。
- 不可含句點 (.)。
- 長度 ≤ 255 字元。
- 在相同作用域內唯一。
- 不可與 VBScript 關鍵字衝突(
If, Then, Else, Dim, Function 等)。
- 建議採用駝峰式或底線分隔:
userName、user_name。
變數宣告語句
| 關鍵字 | 作用域 | 適用層級 | 備註 |
Dim | 程序級/腳本級 | 區域/全域 | 最常用;腳本級可跨程序存取 |
Public | 全域 (腳本級) | 腳本級 | 所有程序可見;.asp 檔案層級相當於 Dim |
Private | 模組/類別內部 | 腳本級 | 僅宣告所在腳本可見;Class 成員常用 |
Dim a, b, c ' 多變數以逗號分隔
Dim arr(5) ' 靜態陣列:6 個元素 (0~5)
Dim matrix(3, 4) ' 二維陣列:4 行 x 5 欄
Option Explicit:強制宣告,杜絕拼字錯誤
<% Option Explicit %>
' 必須置於檔案最頂端(@ Language 之後、任何 HTML/腳本之前)
' 啟用後,所有變數必須先 Dim/Private/Public 宣告才能使用
' 強烈建議所有正式專案啟用
變數作用域與生命週期
| 層級 | 宣告位置 | 可見範圍 | 生命週期 |
| 程序級 | Function/Sub 內部 | 僅該程序 | 程序執行期間 |
| 腳本級 | 所有程序外部 | 整個 .asp 檔案所有程序 | 頁面請求處理期間 |
不同程序可使用同名區域變數,互不干擾。
陣列進階操作
動態陣列
Dim dynArr() ' 宣告時不指定大小
ReDim dynArr(10) ' 設定為 11 個元素
ReDim Preserve dynArr(20) ' 擴充至 21 個,保留原資料
ReDim 不加 Preserve 會清空陣列內容。
- 維度上限 60 維,但實務極少超過 2~3 維。
實用陣列函式
| 函式 | 用途 | 範例 |
UBound(arr, 維度) | 取得指定維度上界索引 | UBound(arr, 1) |
LBound(arr, 維度) | 取得下界 (永遠為 0) | LBound(arr) |
IsArray(var) | 判斷是否為陣列 | If IsArray(x) Then... |
Erase arr | 釋放動態陣列記憶體 / 清空靜態陣列元素 | Erase dynArr |
Join(arr, 分隔字串) | 一維陣列轉字串 | str = Join(arr, ",") |
Split(字串, 分隔字串) | 字串拆分為一維陣列 | arr = Split("a,b,c", ",") |
Filter(arr, 關鍵字, [Include], [Compare]) | 篩選含/不含關鍵字的元素 | Filter(arr, "err", True) |
完整範例:星期陣列與問候語
<html>
<head><title>陣列應用</title>
<script language="VBScript" for="button1" event="onClick">
Dim myWeekDay(6), myWeek
myWeekDay(0) = "星期日" : myWeekDay(1) = "星期一" : myWeekDay(2) = "星期二"
myWeekDay(3) = "星期三" : myWeekDay(4) = "星期四" : myWeekDay(5) = "星期五"
myWeekDay(6) = "星期六"
myWeek = WeekDay(Date) - 1
Select Case True
Case myWeek = 1 : MsgBox "今天是" & myWeekDay(1) & ",一週的開始,努力工作喲。"
Case myWeek = 2 : MsgBox "今天是" & myWeekDay(2) & ",還要努力工作喲。"
Case myWeek = 3 : MsgBox "今天是" & myWeekDay(3) & ",繼續努力工作喲。"
Case myWeek = 4 : MsgBox "今天是" & myWeekDay(4) & ",還有兩天就到週末了,堅持。"
Case myWeek = 5 : MsgBox "今天是" & myWeekDay(5) & ",哈哈,明天是週末。"
Case myWeek = 6 : MsgBox "今天是" & myWeekDay(6) & ",今天可以盡情玩了。"
Case myWeek = 0 : MsgBox "今天是" & myWeekDay(0) & ",好好休息,明天又是新的一週。"
End Select
</script>
</head>
<body>
<form name="form1">
<input type="button" name="button1" value="請查看今天是週幾">
</form>
</body>
</html>
常見錯誤與除錯提示
- 未宣告直接賦值:若未啟用
Option Explicit,會隱性建立全域變數,易造成拼字 Bug(如 userName vs userNmae)。
- 陣列索引越界:存取
arr(UBound(arr)+1) 會拋「Subscript out of range」,循環請用 For i = 0 To UBound(arr)。
- 動態陣列未 ReDim 直接使用:會拋「Array variable has incorrect number of subscripts」。
- ByRef/ByVal 陣列傳遞:VBScript 陣列永遠傳址,函式內修改會影響原陣列;需自行
ReDim Preserve 複製才能隔離。
紮實掌握 Variant 特性、變數作用域與陣列操作,能讓您寫出更安全、高效、易維護的 VBScript 代碼。
- 上一篇文章: ASP 入門教學:VBScript MsgBox 與 InputBox 互動對話框完整指南
- 下一篇文章: ASP 入門教學:VBScript 基礎語法與 HTML 嵌入方式
Copyright ©
程式碼之家 All Rights Reserved