VBscript语言基础小结
在前面短短的几篇文章中,我们通过一系列可运行的实例,已经把VBscript语言的最基本的知识介绍给了读者。用这种方法叙述语言框架当然免不了有疏漏。在本文中我们把遗漏的语言元素补上,对VBscript语言的基础教程作一个小结,入门篇就结束了。进一步的学习请看我的—《VBscript和javascript语言实用技法之研究》(进阶篇)。
一 VBScript 的数据类型
VBScript 只有一种数据类型,称为 Variant。 Variant 是一种特殊的数据类型,根据使用的方式,它可以包含不同类别的信息。因为 Variant 是 VBScript 中唯一的数据类型,所以它也是 VBScript 中所有函数的返回值的数据类型。但是, Variant包含各种子类型,下表显示 Variant 包含的子类型:
子类型 | 描述 |
Empty | 未初始化的 Variant。对于数值变量,值为 0;对于字符串变量,值为零长度字符串 ("")。 |
Null | 不包含任何有效数据的 Variant。 |
Boolean | 包含 True 或 False。 |
Byte | 包含 0 到 255 之间的整数。 |
Integer | 包含 -32,768 到 32,767 之间的整数。 |
Currency | -922,337,203,685,477.5808 到 922,337,203,685,477.5807。 |
Long | 包含 -2,147,483,648 到 2,147,483,647 之间的整数。 |
Single | 包含单精度浮点数,负数范围从 -3.402823E38 到 -1.401298E-45,正数范围从 1.401298E-45 到 3.402823E38。 |
Double | 包含双精度浮点数,负数范围从 -1.79769313486232E308 到 -4.94065645841247E-324,正数范围从 4.94065645841247E-324 到 1.79769313486232E308。 |
Date (Time) | 包含表示日期的数字,日期范围从公元 100 年 1 月 1 日到公元 9999 年 12 月 31 日。 |
String | 包含变长字符串,最大长度可为 20 亿个字符。 |
Object | 包含对象。 |
Error | 包含错误号。 |
二 常量和变量
什么是常数?常数是具有一定含义的名称,用于代替数字或字符串,其值从不改变。VBScript 定义了许多固有常数。详细信息,请参阅 VBScript 语言参考。您可以使用Const语句在VBScript 中创建用户自定义常数。使用Const语句可以创建名称具有一定含义的字符串型或数值型常数,并给它们赋原义值。例如:
Const MyString = "这是一个字符串。" Const MyAge = 49
什么是变量?变量实际上是赋予了名称(变量名)的一块内存地址,只要通过变量名引用变量就可以查看或更改变量的值。在VBScript中因为只有一个基本数据类型,因此所有变量的数据类型都是 Variant。
在VBScript中也可以未经声明就使用变量,但是,先声明后引用是一种好习惯,何况其它语言的变量必须先声明后引用。声明变量的一种方式是使用 Dim 语句、Public 语句和 Private 语句在脚本中显式声明变量。
- 第一个字符必须是字母。
- 不能包含嵌入的句点。
- 长度不能超过 255 个字符。
- 在被声明的作用域内必须唯一。
变量的作用域与存活期
变量的作用域由声明它的位置决定。如果在过程中声明变量,则只有该过程中的代码可以访问或更改变量值,此时变量具有局部作用域并被称为 过程级变量。如果在过程之外声明变量,则该变量可以被脚本中所有过程所识别,称为 Script 级变量,具有脚本级作用域。变量存在的时间称为存活期。Script 级变量的存活期从被声明的一刻起,直到脚本运行结束。对于过程级变量,其存活期仅是该过程运行的时间,该过程结束后,变量随之消失。在执行过程时,局部变量是理想的临时存储空间。可以在不同过程中使用同名的局部变量,这是因为每个局部变量只被声明它的过程识别
三 运算符和表达式
VBScript有一套完整的运算符,包括算术运算符、比较运算符、连接运算符和逻辑运算符。由运算符和常量变量连接而成的式子称为表达式。任何表达式经运算后都有一个最终结果,这个结果的子类型被看作是表达式的类型。
下面列举所有的运算符。
算术运算符 +, -, *, /, /(整除), Mod(取余),^(求幂)
连接运算符 & ( 连接字符串)
赋值运算符 = (或称为赋值语句)
比较运算符 >, <, =, >=, <=, <>
逻辑运算符 NOT(非), AND(与), OR(或), XOR(异或), IMP(蕴涵), EQV(等价)
逻辑运算中的与,或,非这三种是必须掌握的,后三种不常用,可以不掌握。详细信息,请参阅 VBScript 语言参考。
运算符优先级
当表达式包含多个运算符时,将按预定顺序计算每一部分,这个顺序被称为运算符优先级。可以使用括号越过这种优先级顺序,强制首先计算表达式的某些部分。运算时,总是先执行括号中的运算符,然后再执行括号外的运算符。但是,在括号中仍遵循标准运算符优先级。 运算符的优先级如下所示(高>>低):算术运算符>>比较运算符>>逻辑运算符。
比较运算符都是同级的,逻辑运算符优先级为:NOT>>AND>>OR。算术运算符的优先级是不言而喻的。
四 语句
语句是任何编程语言的基本要素,程序就是由一系列语句组成的。在前面的几篇文章中我们使用了绝大多数基本语句。下面把基本语句及其语法功能列成简表以方便查询。
语句名称 | 语法形式 | 功能描述 |
Call | [Call] name [argumentlist] | 将控制权传递给 Sub 或 Function 过程。call 动词可省略。 |
Const | Const constname = expression | 声明用于代替文字值的常数。 |
Dim | Dim varname[([subscripts])], . . | 声明变量并分配存储空间 |
Do...Loop | Do [{While | Until} condition] | While:当条件为 True 时重复执行某语句块。 Until:当条件变为 True 之前重复执行某语句块。 |
Erase | Erase array | 重新初始化固定大小数组的元素,并释放动态数组的存储空间。 |
Execute | Execute statements | 执行一个或多个指定的语句。 |
Exit | Exit Do [ For| Function| Property| Sub] | 退出 Do...Loop、For...Next、Function 或 Sub 代码块。 |
For...Next | For counter = start To end [Step step] | 以指定次数重复执行一组语句。 |
For Each...Next | For Each element In group | 对数组或集合中的每个元素重复执行一组语句。 |
Function | Function name [(arglist)] | 声明 Function 过程的名称、参数以及构成其主体的代码。 |
If...Then...Else | If condition Then | 根据表达式的值有条件地执行一组语句。 |
On Error | On Error Resume Next | 启动错误处理程序。 |
Option Explicit | Option Explicit | 强制要求显式声明脚本中的所有变量。该语句必须出现在脚本的任何其他语句之前。 |
Private | Private varname [([subscripts])][, ...]. | 定义私有变量并分配存储空间。在 Class块中定义私有变量。 |
Public | Public varname [([subscripts])][, ...] | 定义公有变量并分配存储空间。在 Class 块中定义私有变量。 |
Randomize | Randomize [number] | 初始化随机数生成器。 |
ReDim | ReDim varname (subscripts) [, . . . | 在过程级中声明动态数组变量并分配或重新分配存储空间。 |
Rem | Rem comment 或 ' comment | 包含程序中的解释性注释。 |
Select Case | Select Case testexpression | 根据表达式的值执行几组语句之一。 |
Set | Set objectvar = objectexpression | 将对象引用赋给变量或属性,或者是用一个事件关联一个过程引用。 |
Sub | Sub name [(arglist)] | 声明 Sub 过程的名称、参数以及构成其主体的代码。 |
While...Wend | While condition | 当指定的条件为 True 时,执行一系列的语句。为熟悉就语法的所设,建议使用Do Loop语句。 |
With | With object | 在对一个对象执行一系列的语句时,With 与End With内部可省略写对象名。 |
除了Do Loop 和 While 两种循环语句外,其它语句在前面的几篇文章中都使用到了。下面是由微软公司给出的例子说明如何使用 Do...Loop 语句:
Do Until DefResp = vbNo MyNum = Int (6 * Rnd + 1) ' 产生 1 到 6 之间的随机数。 DefResp = MsgBox (MyNum & " 想要另一个数吗?", vbYesNo) Loop Dim Check, Counter Check = True: Counter = 0 ' 初始化变量。 Do '外层循环。 Do While Counter < 20 '内层循环。 Counter = Counter + 1 ' 增加计数器。 If Counter = 10 Then ' 如果条件为 True... Check = False ' 将标志值设置为 False。 Exit Do ' 终止内层循环。 End If Loop Loop Until Check = False ' 立即终止外层循环。
其中vbYesNo是VBscript预制的常数,值=4,表示显示是和否按钮。vbNo=7用来接收消息框函数的返回值,表示否按钮被单击。
五 函数与子程序
函数与子程序都是一个过程。分别有function 和 sub语句来定义。它们的区别是:
- 函数返回一个唯一的值,而子程序不返回值。
- 调用函数时必须加括号,即使没有参数。调用子程序则不能和、加括号,参数值表直接跟在后面。
- 函数一般形如变量出现在表达式中,子程序形如语句单独出现。
VBscript预定义了许多内置函数,随时可直接使用。我们在前面已经详细介绍了数值函数、字符串函数和日期函数。下面仅补上类型转换函数。一般格式 Cxxxx(表达式)。
函数名 | 返回类型 |
CBool | 布尔型 |
CByte | 字节 |
CCur | 货币 |
CDate | 日期 |
CDbl | 双精度 |
CInt | 整数 |
CLng | 长整数 |
CSng | 单精度 |
CStr | 字符串 |
此外,还有一个Filter 函数。其功能是过滤一个字符串数组,返回符合条件的子集合数组。语法:
Filter(InputStrings, Value[ , Include[ , Compare]] )Filter 函数的语法有以下参数:
参数 描述 InputStrings 必选。一维数组,要在其中搜索字符串。 Value 必选。要搜索的字符串。 Include 可选。Boolean 值,指定返回的子字符串是否包含Value。如果 Include 为 True,Filter 将返回包含子字符串 Value 的数组子集。如果 Include 为 False,Filter 将返回不包含子字符串 Value 的数组子集。 Compare 可选。数字值指出使用的比较字符串类型.请参阅值设置部分.
最后,作为本文的结束,我们给出一个有用的实例程序。在数据库的应用中,最基本的工作是查询,而查询的结果得到一张表,是以二维数组的形式存在的。我们的实例就是用程序来生成一张表格,把查询结果显示在屏幕上。
目标任务 自动生成一个表格,其行列数由一个作为参数的数组决定。
代码
Sub TableGenalete (Arrayname)
dim width1,row,col
row = Ubound(Arrayname,1)
col = Ubound(Arrayname,2)
width1 = cStr(INT(100/col)) & "%"
document.write (TABLE_("100%","1"))
document.write ("<TR>")
for j =0 to col-1
TDmass = TD_( width1,"#c0c0c0")
week = weekdayName(weekday(j+1))
TDmass = replace(TDmass,"AA",Week )
document.write TDmass
Next
document.write ("</TR>")
for i=0 to row-1
document.write ("<TR>")
for j =0 to col-1
TDmass = TD_( width1,"#dddddd")
TDmass = replace(TDmass,"AA",Arrayname(i,j))
document.write TDmass
Next
document.write ("</TR>")
Next
document.write ("</TABLE>")
End sub
代码注释
TableGenalete子程序将在页面上生成一个表格。第一个单循环生成表头行,为了显示时醒目,该行内容为“星期日”到“星期六”。下一个两重循环逐行生成表格的每一个单元格和它的内容——数组Arrayname的对应元素。单元格的HTML代码<TD ...>由自定义函数TD_()产生,它设定了两个参数—宽度和背景颜色。也就是说,这两个参数是可变的,其它的是默认值。
为了演示观看效果,还需要一段主程序来调用它代码如下。
dim Myarray(5,7)
for i=0 to 4
for j=0 to 6
Myarray(i,j)= cStr(10*i+j+1)
next
next
TableGenalete Myarray
两个自定义函数如下:
function TD_(width1,bgcolor1)
dim ss
ss = "<TD width=" & CHR(34) & "50%" &CHR(34) & " bgcolor
=" & CHR(34) & "#FFFFFF" &CHR(34)& ">AA</TD>"
ss = replace(ss,"50%",width1)
if bgcolor1<>"" then
ss = replace(ss, "#FFFFFF" ,bgcolor1)
End if
TD_=ss
End function
function TABLE_(width1,border1)
dim ss
ss = "<TABLE width=" & CHR(34) &"100%" &CHR(34) & " border='1' >"
ss = replace (ss, "100%",width1)
ss = replace (ss, "1" , border1)
TABLE_=ss
End function
函数的功能是建立写HTML代码所需要的字符串,其中的AA在调用时由相应的数组元素来替换它。如果你不替换,也不妨碍程序的运行。该函数还可以简化,把AA和后面的部分放到主函数中去实现,而这里省去replace的使用,您自己试试。
文 东方一峰 2002-12-27