我只是在玩JavaScript而被一个简单的程序所困扰。
我在JavaScript中声明了一个数组
var a = [0, 1, 2];
然后,由于JavaScript中没有固定的数组大小,我们可以向数组中添加更多的大小,因此我向数组中添加了另一个整数。
a[3] = 3;
和预期的一样,如果我尝试访问,a[4]我肯定会获得undefined。
a[4]
undefined
现在,如果我取一个数组
var a = [0,1,2];
并添加另一个元素
a[4] = 4;
我故意没有定义a[3],而这也给了我a[3]作为undefined。
a[3]
这是一个可以观察到的小提琴:http : //jsfiddle.net/ZUrvM/
现在,如果我在Java中尝试相同的操作,
int[] a = new int[4]; a[0] = 0; a[1] = 1; a[3] = 3;
然后我最终
a[2] = 0;
您可以在ideone上看到它:https ://ideone.com/WKn6Rf
我在Java中发现此问题的原因是,在声明数组时定义了四个变量,我们只能将值分配给声明的数组大小。但是在JavaScript中,当我声明一个大小为3的数组,然后添加第5个元素时,为什么不将第4个元素视为是,null或者0如果我们将数组大小增加到4以上呢?
null
0
为什么在JavaScript中会看到这种奇怪的行为,而在其他语言中却看不到?
为什么在JavaScript中这种奇怪的行为?
因为数组只是对象。如果您访问不存在的属性,则会返回undefined。您只是没有在index处分配元素3,所以什么也没有。
3
通过分配更高的索引来自动增长数组不会更改此行为。会影响.length属性,是的,但是中间索引将不存在。这称为稀疏数组。
.length
为什么在Java / C / C ++中这种奇怪的行为?
因为数组是分配的内存的大块,所以当分配大小为4的数组时,其所有元素均从该内存位置获取其值。为了避免不确定的值,在某些语言/场合中,字段通常使用进行默认初始化0。