- 语句
VBScript的语句可以是一个声明或者一个表达式,或者是注释语句。语句自然结束(换行符),没有特殊的终结符。如果一条语句中包含有单引号('),则该单引号后面的内容被看作是注释。
- 变量,常量和数据类型
VBScript只支持一种变量数据类型,即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允许通过Class关键字定义用户数据类型。语法是:
Class name
statements
End Class
如我们可以定义一个CPoint类:
Class CPoint
public x
public y
Sub Dump()
MsgBox("x=" & x)
MsgBox("y=" & y)
End Sub
End Class
类似于C++,VBScript中的类也支持构造和析构,这是通过声明
Private Sub Class_Initialize()
语句
End SubPrivate Sub Class_Terminate()
>语句
End Sub
来实现的。下面的例子演示了对象创建和析构时的调用。不过,没有办法给这两个方法传入参数,从而限制了这两个方法的应用。默认地,与C++不同,类的方法和成员都是公用的。当然,VBScript并不支持声明与定义分离,这使得类过程定义必须全部写在类声明之中,从而使用类声明很冗长,不方便阅读。
使用 Dim 语句、Public 语句或Private 语句在脚本中显式声明变量。例如:
Dim DegreesFahrenheit
Dim Top, Bottom, Left, Right '声明多个变量
Public MyArray(9) '声明一个有9个元素的一维数组,且此数组对本应用中所有脚本所有过程可见
Private thisScript '声明一个仅对本脚本可见的变量
前面的例子已经给出了如何声明一个固定元素个数的一维数组。下面是一组声明动态数组和多维数组的例子:
Dim MyArray()
Dim MyTable(5, 10)
这里有几点注意:
1. 默认数组下标从0开始,因些MyTable是一个有6行和11列二维数组。
2. 动态数组在声明前必须分配空间后才能使用,即在使用前,必须使用ReDim 语句确定空间大小。如:
ReDim MyArray(25)
ReDim 的调用类似于函数调用,因此这里的25可以用已经确定取值的变量来替换。
使用const来声明一个常量。如:
Const MyString = "这是一个字符串。"
Const MyAge = 49
- 变量的赋值和初始化
DegreesFahrenheit = 110
MyArray(0) = 0 '对数组元素赋值
MyArray(1) = 1
…
MyArray(9) = 9
对子类型是对象的变量的赋值必须使用Set语句,除前面在谈论类声明时给出的例子外,这里再给出一个例子:
Dim fs
Set fs = CreateObject("Scripting.FileSystemObject")
这样的赋值是错误的:
这样的赋值是错误的:
fs = CreateObject("Scripting.FileSystemObject")
这里可以看出,VBSCript尽管是无类型的语言,但数据间的可互操作性决定了变量必然从属于某个子类型,从而变量的赋值,运算和转换也要服从某些规定,否则要么无法通过语法检查,要么更恶劣地,造成逻辑错误。
VBScript不存在C/C++语法意义上的初始化。变量的初始化在第一次赋值时完成,也不存在静态变量。好在我们还有全局(publi)变量来临时代替静态变量的使用。对自定义类型(class),尽管存在Initialize和Terminate事件在分别对象创建和销毁时被调用,由于这两个事件都不接受变量,因而也不存在对类变量真正意义上的初始化。
- 变量的比较运算和类型运算
对象变量的比较运算在这里需要提及一下。
在语句fs = CreateObject("Scripting.FileSystemObject")中,FilseSystemObject对象有可能创建失败。在C/C++中,这种情况下常常返回null值以示失败。在VBScript中,可以用IsNull(obj)来判断对象obj是否为null值 。永远不要用if obj = NULL或者if obj <> NULL来判断对象obj是否为有效。IsEmpty(var)是一个令人困惑的函数,它用来判断变量var是否仅仅只声明过而未初始化。函数IsObject则可以用来判断某个变量是否属于某个类型。
总之,由于VBScript的无类型性,因而在变量比较和类型运算上比较困难,这也造成程序排错与调试上的困难。下面给出了一些示例:
Dim MyVar, MyCheck
wscript.echo "MyVar is " & MyVar
i = 3 + MyVar
wscript.echo "i = " & iIf IsEmpty(MyVar) Then wscript.echo "MyVar is Empty"
MyVar = Null ' 赋为 Null。
If (Not IsEmpty(MyVar)) And IsNull(MyVar) Then wscript.echo "MyVar is not Empty but Null"MyVar = Empty ' 赋为 Empty。
If IsEmpty(MyVar) And (Not IsNull(MyVar)) Then wscript.echo "MyVar is Empty, not Null"
输出结果为:
MyVar is
i = 3
MyVar is Empty
MyVar is not Empty but Null
MyVar is Empty, not Null
鉴于类型是如此重要,我们再看一个函数,VarType()。下面给出了VarType调用可能得到的返回值。
常数 | 值 | 描述 |
---|---|---|
vbEmpty | 0 | Empty(未初始化) |
vbNull | 1 | Null(无有效数据) |
vbInteger | 2 | 整数 |
vbLong | 3 | 长整数 |
vbSingle | 4 | 单精度浮点数 |
vbDouble | 5 | 双精度浮点数 |
vbCurrency | 6 | 货币 |
vbDate | 7 | 日期 |
vbString | 8 | 字符串 |
vbObject | 9 | Automation 对象 |
vbError | 10 | 错误 |
vbBoolean | 11 | Boolean |
vbVariant | 12 | Variant(只和变量数组一起使用) |
vbDataObject | 13 | 数据访问对象 |
vbByte | 17 | 字节 |
vbArray | 8192 | 数组 |
几个例子:
Dim MyCheck
MyCheck = VarType(300) ' 返回 2。
MyCheck = VarType(#10/19/62#) ' 返回 7。
MyCheck = VarType("VBScript") ' 返回 8。
通过上面的调用可以看出,在VBScript中,数据类型的确是由赋值决定的。因些在变量互操作时,要考虑根据变量的取值来确定其数据类型,进而决定两者是否可以直接参与运算。在后面函数和过程一节中,会有示例进一步演示VarType的用法。