JavaScript与Java中数组中的非初始化项有什么区别?

Nae*_*ikh 20 javascript java arrays

我刚刚玩JavaScript并且遇到了一个简单的程序.

我用JavaScript声明了一个数组

var a = [0, 1, 2];
Run Code Online (Sandbox Code Playgroud)

然后由于JavaScript中的数组没有固定的大小,我们可以向数组中添加更多,我向数组添加了另一个整数.

a[3] = 3;
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,如果我试图访问,a[4]我肯定会得到它undefined.

现在,如果我拿一个数组

var a = [0,1,2];
Run Code Online (Sandbox Code Playgroud)

并添加另一个元素

a[4] = 4;
Run Code Online (Sandbox Code Playgroud)

我故意没有定义a[3],而这也给了我a[3]作为undefined.

这是一个可以观察到的小提琴:http://jsfiddle.net/ZUrvM/

现在,如果我在Java中尝试相同的事情,

int[] a = new int[4];
a[0] = 0;
a[1] = 1;

a[3] = 3;
Run Code Online (Sandbox Code Playgroud)

然后我结束了

a[2] = 0;
Run Code Online (Sandbox Code Playgroud)

你可以在ideone上看到这个:https://ideone.com/WKn6Rf

我发现Java的原因是在声明数组时定义了四个变量,我们只能为声明的数组大小赋值.但是在JavaScript中,当我声明一个大小为3的数组然后添加第5个元素时,为什么它不考虑第4个元素,null或者0我们是否将数组大小增加到4以上?

为什么我在JavaScript中看到这种奇怪的行为,而在其他语言中却看不到?

Ber*_*rgi 17

为什么JavaScript中有这种奇怪的行为?

因为数组只是对象.如果您访问一个不存在的属性,您会回来undefined.你只是没有在索引处分配一个元素3,所以什么都没有.

通过分配更高的索引来自动生成阵列不会改变此行为.它会影响.length财产,是的,但中间指数将不存在.这称为稀疏数组.

为什么Java/C/C++中有这种奇怪的行为?

因为数组是已分配内存的块,并且在分配大小为4的数组时,其所有元素都从该内存位置获取它们的值.为了避免不确定的值,在某些语言/场合中,字段会默认初始化,通常使用0.