1

一般来说,数组不会有不同数据类型的值,但是当使用 Items 方法从字典对象中提取数据时。它处理不同数据类型的数据。

谁能澄清一下,数组是否有可能具有不同数据类型的值?

Option Explicit

Dim D, i, Arr

Set D = CreateObject("Scripting.Dictionary")

D.CompareMode = VbTextCompare

D.Add "1", 56

D.Add "2", 78

 D.Add "3", "John"

D.Add "4", 100

Arr = D.Items

For i=0 to ubound(Arr) Step+1

Msgbox Arr(i)

Next
4

1 回答 1

1

VBScript 的类型非常弱。所有变量都是变体(不同的子类型:整数、字符串、对象……)。集合可以包含所有子类型的项目;这些项目甚至可以是不同的子类型。

甚至字典的键也不必是字符串;它们也可以是对象。WRT这个关于字典和数组的问题,我必须补充:数组可以是项目,但不是字典的键:

>> Set d = CreateObject("Scripting.Dictionary")
>> d.Add "Company", Array("microsoft", "apple")
>> WScript.Echo Join(d("Company"))
>> a = d("Company") <== array assignment in VBScript COPIES!
>> a(1) = "samsung"
>> WScript.Echo Join(a)
>> WScript.Echo Join(d("Company"))
>>
microsoft apple
microsoft samsung
microsoft apple
>> d.Add a, "won't work"
>>
Error Number:       5
Error Description:  Invalid procedure call or argument

需要注意的子类型是固定数组(用 定义Dim a(ConstNumber))。元素是相当不受限制的,但是如果您可以将固定数组放入集合中,我会感到惊讶。

更新(wrt 固定数组):

固定数组及其元素以某种特殊方式存储以提高性能。我对细节一无所知,但它是一种特殊类型的数组(不能增长)。

将某些东西放入集合中意味着:将某些东西(类型 + 值)的副本放入。如果该东西是一个简单的变量或数组,那么您将失去与原始的连接(再次考虑指出这一点,@Ansgar )。如果某物是对象,则引用(对象)的副本仍然可以让您访问原始数据。

进入集合的固定数组的副本(好的,测试只使用字典)丢失了特殊类型:

Option Explicit

Dim Af(0)   : Af(0) = "fixed"
ReDim Ad(0) : Ad(0) = "dyn"
WScript.Echo 0, Af(0), Ad(0)

Dim dicX : Set dicX = CreateObject("Scripting.Dictionary")
dicX(0) = Af
dicX(1) = Ad
WScript.Echo 1, dicX(0)(0), dicX(1)(0)
Af(0)    = UCase(Af(0))
Ad(0)    = UCase(Ad(0))
WScript.Echo 2, Af(0), Ad(0)
WScript.Echo 3, dicX(0)(0), dicX(1)(0)
grow dicX(0)
grow dicX(1)
WScript.Echo 4, Join(dicX(0)), Join(dicX(1))
grow Ad
WScript.Echo 5, Join(Ad)
grow Af

Sub grow(a)
  ReDim Preserve a(Ubound(a) + 1)
  a(1) = "array"
  WScript.Echo "**", Join(a)
End Sub

输出:

cscript doa.vbs
0 fixed dyn
1 fixed dyn
2 FIXED DYN
3 fixed dyn
** fixed array
** dyn array
4 fixed dyn
** DYN array
5 DYN array
E:\trials\SoTrials\answers\15008949\vbs\doa.vbs(23, 3) Microsoft VBScript runtime error: This array is fixed or temporarily locked

** fixed array行证明传递给的数组grow不再固定;它与Af不能生长的类型不同。

于 2013-02-26T18:13:51.497 回答