在Python和Ruby中,负下标从数组末尾向后索引。也就是说,当下标为负时,数组长度将加到它上面。在
Lua的情况并非如此。负下标没有特殊含义;它只是引用或创建一个以负数为键的表项。在
Python 2.7.3:>>> a = [ 'x', 'y', 'z' ]
>>> a
['x', 'y', 'z']
>>> a[-1]
'z'
>>> a[-1] = 'm'
>>> a
['x', 'y', 'm']
>>>
Ruby 1.9.3版:
^{pr2}$
Lua 5.2.3:> a = { 'x', 'y', 'z' }
> for key, value in pairs(a) do print( key, value ) end
1 x
2 y
3 z
> print( a[3] )
z
> print( a[-1] )
nil
> a[-1] = 'm'
> print( a[-1] )
m
> for key, value in pairs(a) do print( key, value ) end
1 x
2 y
3 z
-1 m
>
JavaScript的行为与Lua非常相似,可以在数组上使用负下标,事实上可以使用任意字符串作为下标。JavaScript数组实际上是一个具有一些附加方法、属性(.length)和行为(根据需要更新.length)的对象。当您使用array[-1]时,您正在添加或引用带有键"-1"的属性,.length不会更新。在
铬33:> var a = [ 'x', 'y', 'z' ];
undefined
> a
["x", "y", "z"]
> a[2]
"z"
> a[-1]
undefined
> a[-1] = 'm'
"m"
> a[-1]
"m"
> a[2]
"z"
> a
["x", "y", "z"]
> for( var key in a ) console.log( key, a[key] );
0 x
1 y
2 z
-1 m
undefined
不要被末尾打印的undefined误导——这不是for( var key in a )枚举的一部分,它只是在那里打印,因为console.log()是循环中计算的最后一个表达式,它不返回值(它只是打印值)。在