由于VBScript(经典ASP)中的IF语句中的隐式转换在处理变量或文字时没有以相同的方式进行隐式转换,因此我们目前遇到了问题。有人可以向我解释这个行为,为什么VBScript这样做?
以下是我的意思的样本:
Const c_test = 3
Dim iId : iId = 3
Dim iTestStr : iTestStr = "3"
If iId = iTestStr Then
Response.Write("Long variable = String variable : Equal")
Else
Response.Write("Long variable = String variable : Not Equal")
End If
Response.Write("<br/>")
If c_test = iTestStr Then
Response.Write("Long constant = String variable : Equal")
Else
Response.Write("Long constant = String variable : Not Equal")
End If
Response.Write("<br/>")
If c_test = iId Then
Response.Write("Long constant = Long variable : Equal")
Else
Response.Write("Long constant = Long variable : Not Equal")
End If
Response.Write("<br/>")
If iId = "3" Then
Response.Write("Long variable = String literal : Equal")
Else
Response.Write("Long variable = String literal : Not Equal")
End If
Response.Write("<br/>")
If c_test = "3" Then
Response.Write("Long constant = String literal : Equal")
Else
Response.Write("Long constant = String literal : Not Equal")
End If
哪个输出:
长变量=字符串变量:不等于
长常量=字符串变量:不等于
长常数=长变量:等于
长变量=字符串文字:等于
长常量=字符串文字:等于
o_O
令人困惑答案 0 :(得分:4)
这是一个记录在案的行为和一个未记录的行为的结果。
记录的行为是,在比较中,数字总是小于字符串。这在Comparison Operators的文档中提到。解释页面底部附近的表格:
如果一个表达式是数字而另一个是字符串,则数字表达式小于字符串表达式。
未记录的行为是涉及文字的比较与涉及变量的比较的处理方式不同。有关详细信息,请参阅this blog entry。总结一下重要的结论:
VB6 / VBScript中的相关比较规则如下:
- 硬串〜硬编号:将字符串转换为数字,比较数字
- 硬字符串〜软编号:将数字转换为字符串,比较字符串
- 软字符串〜硬编号:将字符串转换为数字,比较数字
- 软字符串〜软编号:任何字符串都大于任何数字
记录的行为解释了为什么前两个比较是错误的,而未记录的行为解释了为什么最后两个比较是真的。
答案 1 :(得分:1)
您(隐式)声明您的变量As Variant
,因此您的If
条件实际上会测试两个Variant
的相等性,并确定它们是不相等的。
但是,在最后一种情况下,您使用String
常量(即使声明没有类型,也永远不会是Variant
)和String
文字。
我的猜测就是当您比较两个Variant
时,VB首先确定它们是否具有相同的类型标记,如果不相同,则解析为False
。