Javascript-在数组中的索引-1处设置值应该做什么?

Javascript-在数组中的索引-1处设置值应该做什么?,javascript,arrays,Javascript,Arrays,我惊讶地发现: var a = [1, 2, 3]; a[-1] = 4; 可能会产生不同的结果: 在chrome->a是[1,2,3] 在节点->中,a是[1,2,3'-1':4] 预期的行为是什么,如果有的话?无论发生什么,结果都应该是相同的。其中任何一个在控制台中的显示方式都可能不同,但在实践中,控制台中显示值的方式实际上与基础机制没有任何关系。在本例中,效果相同:名为-1的属性设置为4。但是,除非您专门将起始值设置为-1,并且-1处的值很可能(不要引用我的话)不会反映在数组的len

我惊讶地发现:

var a = [1, 2, 3];
a[-1] = 4;
可能会产生不同的结果:

  • 在chrome->
    a
    [1,2,3]
  • 在节点->
    中,a
    [1,2,3'-1':4]

预期的行为是什么,如果有的话?

无论发生什么,结果都应该是相同的。其中任何一个在控制台中的显示方式都可能不同,但在实践中,控制台中显示值的方式实际上与基础机制没有任何关系。在本例中,效果相同:名为
-1
的属性设置为4。但是,除非您专门将起始值设置为
-1
,并且
-1
处的值很可能(不要引用我的话)不会反映在数组的
length
属性中,否则您将无法正常地迭代该值

如果您感兴趣,以下是阵列的ECMAScript规范:

数组实例的长度属性定义如下:


无论发生什么情况,结果都应该是相同的。其中任何一个在控制台中的显示方式都可能不同,但在实践中,控制台中显示值的方式实际上与基础机制没有任何关系。在本例中,效果相同:名为
-1
的属性设置为4。但是,除非您专门将起始值设置为
-1
,并且
-1
处的值很可能(不要引用我的话)不会反映在数组的
length
属性中,否则您将无法正常地迭代该值

如果您感兴趣,以下是阵列的ECMAScript规范:

数组实例的长度属性定义如下:


两者的结果相同;它们只是以不同的方式显示。在Chrome中,
a[-1]
仍然是
4
,并且它不会“在”它们中的任何一个数组中–只是一个常规的非索引属性,就像设置
a.foo=4
一样。本文可能会有所帮助:记住,Javascript数组只是一个以
array
为原型的对象。您可以在其上设置任何属性,就像任何其他对象一样;它们只是以不同的方式显示。在Chrome中,
a[-1]
仍然是
4
,并且它不会“在”它们中的任何一个数组中–只是一个常规的非索引属性,就像设置
a.foo=4
一样。本文可能会有所帮助:记住,Javascript数组只是一个以
array
为原型的对象。你可以在它上面设置任何属性,就像其他任何对象一样。是的,它不在
长度
中考虑!感谢您检查,@Guig.and do
a[6]=1
会将长度增加到7,甚至键
3、4、5
也不包括在对象中。@Guig可能您正在回复的内容已被删除。length属性始终至少比最大索引大一个。如果数组的索引为5,则添加小于5的索引不会影响长度(长度至少为6,可能更大,而不管是否有任何索引小于5)。@Guig:RobG说了什么。如果一个属性的数值介于
0
2^32-2
之间,则该属性被视为一个索引(不100%确定上限,这在最新规范中可能也发生了变化)。是的,
长度中没有考虑它!感谢您检查,@Guig.and do
a[6]=1
会将长度增加到7,甚至键
3、4、5
也不包括在对象中。@Guig可能您正在回复的内容已被删除。length属性始终至少比最大索引大一个。如果数组的索引为5,则添加小于5的索引不会影响长度(长度至少为6,可能更大,而不管是否有任何索引小于5)。@Guig:RobG说了什么。如果某个属性的数值介于
0
2^32-2
之间,则该属性被视为一个索引(无法100%确定上限,这在最新规范中也可能已更改)。