It’s kind of strange.
- one dimensional.
- associative; that is, indexed by strings. Numeric indices are actually converted to strings internally.
arr = 123; arr = 456;gives you a two-member array, not a million-member array.
- an object with properties and methods.
Whereas a VBScript array is
- indexed by integer tuples.
- not an object.
It is hard to come up with two things that could be more different and yet both called “array”!
As you might expect, JScript and VBScript arrays have completely different implementations behind the scenes. A JScript array is basically just a simple extension of the existing JScript expando object infrastructure, which is implemented as a (rather complicated) hash table. A VBScript array is implemented using the
SAFEARRAY data structure, which is pretty much just a structure wrapped around a standard “chunk of memory” C-style array.
Since all the COM objects in the world expect VBScript-style arrays and not JScript-style arrays, making JScript interoperate with COM is not always easy. I wrote an object called
VBArray into the JScript runtime to translate VBScript-style arrays into JScript arrays, but it is pretty kludgy. And though I wrote some code to go the other way — to turn JScript arrays into VBScript arrays — there were just too many thorny issues involving object identity and preservation of information for us to actually turn it on. There weren’t exactly a whole lot of users demanding the feature either, so that part of the feature got cut. (If I recall correctly, my colleague Peter Torr wrote some COM code to do that before he came to work at Microsoft. He might still have it lying around.)
Things got even weirder when I wrote the code to interoperate between CLR arrays and JScript.NET arrays, but that’s another story.
There were a number of good reader follow-up questions to this post. A selection:
VBArrayobject is useful when we have an existing array in hand, but can we have a tool usable from JScript that produces a new one?
I always meant to add that to the runtime but never got around to it, sorry! I did add better support in JScript.NET, but that’s not super useful, I know.
How can I marshal a JScript array object to C#?
We designed the JScript array object interfaces and implementations long, long before C# was even thought of; there’s no obvious way to do so that I know of. Nowadays with
dynamic in C# there might be a way to do it, but I’ve never tried.
Is there a way in VBScript to simulate
Pingback: Porting old posts, part 2 | Fabulous adventures in coding