在Visual Basic中是否有JS的===运算符的等效比较?

时间:2016-09-25 21:20:26

标签: vba

在Visual Basic中是否有等效的===运算符(JavaScript)?我正在尝试学习Visual Basic,并且看到赋值只能是语句,如果在表达式中使用它会在JavaScript(比较运算符)中变成等效的==运算符。

但是,JavaScript的===运算符会在值之间进行可观察的比较,如果两个值的类型不相等,则返回false。例如:

2 === "2" // false
2 == "2" // true ("2" == "2")

我需要在不使用Visual Basic的=运算符的情况下进行类似===的比较,是否可能以及如何进行?

2 个答案:

答案 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