I also program in Javascript. Javascript is, at its core, actually
quite a nice language, strikingly similar to Lua but with a C-like
syntax. (In fact, I think it should be possible to statically
translate Javascript into Lua by simply converting the syntax.)
Javascript has two associative array types: Objects, which are created
with {}, and Arrays, which are created with []. In fact, they're both
the same kind of underlying thing; Arrays are just Objects with helper
methods attached.
Object properties can be accessed by using object.propertyname or
object["propertyname"], just like Lua. The second syntax makes them
look just like associative arrays, and indeed they're very useful as
such. However, just like Lua you end up with problems in that your
data collides with your method names.
But that's all right, because you don't have to use strings. You can
use them as associative arrays with other types, too. Dates, integers,
floating point numbers, and so on.
They even work with objects. Sort of.
var o1 = {name: "object1"}
var o2 = {name: "obejct2"}
var assocarray = {}
assocarray[o1] = 1
assocarray[o2] = 2
This runs fine. Unfortunately...
print(assocarray[o1]) --> 2
print(assocarray[o2]) --> 2
What's going on here?
Closer inspection of the ECMA standard reveals that Objects and Arrays
are, in fact, only keyed on strings. They do an implicit string
conversion when you pass in the key, using the built-in toString()
method. A bit of experimentation reveals...
print(o1.toString()) --> "[object Object]"
print(o2.toString()) --> "[object Object]"
Aaaah! *All* objects, no matter what their content, become the *same*
string! Which means that if you use them as keys to an associative
array, all objects are the *same* key!
Now, *that*'s braindead. You probably won't be surprised to find out
that Javascript has no proper hashing ability at all; and that o1==o2,
o1<o2, and o1>o2 are all false; and so making an associative array
that can be keyed on any arbitrary object is actually rather hard.
(Which I need to do. I have a solution, though.)
It's definitely damning with faint praise to say that Lua manages to
avoid this kind of mishap, but can I just say that on the whole I've
found the level of thought involved with the Lua design to be most
refreshing.
--
[insert interesting .sig here]