在Visual Basic中是否有等效的===运算符(JavaScript)?我正在尝试学习Visual Basic,并且看到赋值只能是语句,如果在表达式中使用它会在JavaScript(比较运算符)中变成等效的==运算符。
但是,JavaScript的===运算符会在值之间进行可观察的比较,如果两个值的类型不相等,则返回false
。例如:
2 === "2" // false
2 == "2" // true ("2" == "2")
我需要在不使用Visual Basic的=运算符的情况下进行类似===的比较,是否可能以及如何进行?
答案 0 :(得分:4)
tl; dr 不,VBA没有严格的股权运营商。
如您所述,VBA对权益和赋值运算符使用=
。它起作用的运算符完全取决于表达式。请注意,与某些语言不同,在VBA中,赋值操作没有返回值(即在a = b = c
之类的C语句中。这意味着解析器可以确定操作是完全依赖于语法的赋值还是权限。
具体转向Java和JavaScript,主要区别在于并非所有内容都是VBA中的对象,并且所有的比较都是在值类型而不是引用类型上进行的。如果要比较对象引用,可以使用对象比较运算符Is
:
Dim foo As Object, bar As Object
'Initialize, yada, yada
If foo Is bar Then 'Tests reference equity
如果您使用权益运算符=
,VBA将实际测试对象的默认成员的权益,或者如果它没有,则抛出异常。例如,假设Foo
对象具有默认属性Value
:
Dim x As Foo, y As Foo
'Initialize, yada, yada
If x = y Then 'This statement is equivalent to:
If x.Value = y.Value Then
就严格权益而言,VBA将尝试将权益运营商=
两侧的变量转换为等效类型。出于这个原因,使用强类型变量而不是Variant
更好的做法,并显式调用对象的默认成员而不是隐式使用默认成员。
对于对象,您可以使用TypeOf
运算符测试类型:
Dim x As Foo, y As Foo
If TypeOf x Is Foo And TypeOf y Is Foo Then
原始类型不等同于TypeOf
:
Dim foo As String
If TypeOf foo Is String Then 'Compile error
您可以使用TypeName()
函数作为代理,但要注意它将返回Variant
的子类型。 AFAIK没有直接测试来确定变量是否为Variant
:
Dim foo As String, bar As Variant
foo = "2"
bar = 2
Debug.Print TypeName(foo) 'String
Debug.Print TypeName(bar) 'Integer
bar = "2"
Debug.Print TypeName(bar) 'String
答案 1 :(得分:1)
VBA中没有严格的比较运算符。作为一种变通方法,您必须使用=
比较值并比较类型,如下所示:
"1" = 1 And TypeName("1") = TypeName(1) // false