多言語をいろいろ使い分けてると型変換・型判定の規則がわからなくなってきたので振り返り
とりあえず、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は、同じインスタンスを参照しているかどうかの判定。