在 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:
irb(main):001:0> a = [ 'x', 'y', 'z' ]
=> ["x", "y", "z"]
irb(main):002:0> a
=> ["x", "y", "z"]
irb(main):003:0> a[-1]
=> "z"
irb(main):004:0> a[-1] = 'm'
=> "m"
irb(main):005:0> a
=> ["x", "y", "m"]
irb(main):006:0>
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 的非常相似。您可以在数组上使用负下标,实际上您可以使用任意 string 作为下标。 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() 是循环中评估的最后一个表达式,它不返回值(它只是打印一个值)。