わんすけに聞いてみる vbscript [VBS]型判定・型変換・連結と演算

[VBS]型判定・型変換・連結と演算

多言語をいろいろ使い分けてると型変換・型判定の規則がわからなくなってきたので振り返り

とりあえず、vbscriptのルールを再確認しながらテスト実行した時のメモ

忘れやすいからねー。

 

1.数値
Dim test, Rslt

test = "1"
Rslt = TypeName(test)   ' 結果:String
Rslt = VarType(test)    ' 結果:8(vbString)
Rslt = IsNumeric(test)  ' 結果:True
Rslt = test + "1"       ' 結果:2
Rslt = test & "1"       ' 結果:11
Rslt = test + "1" & "1" ' 結果:111
Rslt = test & "1" + "1" ' 結果:111

文字としての数字は、TypeNameだとString、IsNumericではTrue

&での結合が含まれている時は、+しても文字の連結になるみたい。

2.日付(String)
Dim test, Rslt

test = "2019/01/21"
Rslt = TypeName(test)   ' 結果:String
Rslt = VarType(test)    ' 結果:8(vbString)
Rslt = IsNumeric(test)  ' 結果:False
Rslt = IsDate(test)     ' 結果:True
' Rslt = test + 1       ' 式エラー 型が一致しません '[string:"2019/01/21"]'
' Rslt = test > 1       ' 式エラー 型が一致しません '[string:"2019/01/21"]'

文字列で日付っぽいのを変数に入れた時、TypeNameとIsDateは数値の時と変わらない。

+しても日付に自動変換される訳ではなく比較演算子も効かない様子。

3.日付(リテラル)
Dim test, Rslt

test = #2019/01/21#
Rslt = TypeName(test)   ' 結果:Date
Rslt = VarType(test)    ' 結果:7(vbDate)
Rslt = IsNumeric(test)  ' 結果:False
Rslt = IsDate(test)     ' 結果:True
Rslt = test + 1         ' 結果:2019/01/22
Rslt = test & 1         ' 結果:2019/01/211 (Typename⇒String)
Rslt = test > 1         ' 結果:True

リテラルで変数に入れとくと+1の加算が効くようになる。

比較演算子も効くけど、文字列として無理やり結合することもできる。

4.真偽(Boolean)
Dim test, Rslt

test = "true"
Rslt = TypeName(test)   ' 結果:String
Rslt = VarType(test)    ' 結果:8(vbString)
Rslt = test And True    ' 結果:True
Rslt = test & True      ' 結果:trueTrue
Rslt = CBool(1)         ' 結果:True
Rslt = CBool(-1)        ' 結果:True
Rslt = True > False     ' 結果:False
Rslt = True >= False    ' 結果:False
Rslt = True < False     ' 結果:True
Rslt = True <= False    ' 結果:True

文字でTrueを表現した場合、CBool()での型変換は負の数字でもTrue。

比較演算子の結果も式エラーになる訳ではなくTrue/Falseで返ってくる。

5.オブジェクト(Object)
Dim obj1, obj2, Rslt

Set obj1 = CreateObject("Scripting.FileSystemObject")
Set obj2 = CreateObject("Scripting.FileSystemObject")

Rslt = TypeName(test)   ' 結果:FileSystemObject
Rslt = VarType(test)    ' 結果:9(vbObject)
' Rslt = obj1 = obj2    ' 式エラー オブジェクトでサポートされていないプロパティまたはメソッドです。
Rslt = obj1 Is obj2     ' False

TypeNameではObjectみたいな抽象ではなくちゃんとインスタンス型の名前が返ってくる。

Isは、同じインスタンスを参照しているかどうかの判定。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Related Post