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

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

我用JavaScript声明了一个数组

var a = [0, 1, 2]; 

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

 a[3] = 3; 

正如预期的那样,如果我尝试访问a[4]我肯定会将其视为undefined

现在,如果我拿一个数组

 var a = [0,1,2]; 

并添加另一个元素

 a[4] = 4; 

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

这是一个小提琴,可以观察到这一点: 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个元素视为null0如果我们将数组大小增加到4以上?

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

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

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

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

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

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

JavaScript不是强类型语言。

在Java中,您声明了一个整数数组。 该数组中任何元素的默认值为0。

在JavaScript中,当您声明一个数组时,默认值是未定义的,因为它可以包含任何东西,数字,字符串,任何对象(包括另一个数组)。 JavaScript数组的所有元素不必是同一类型。

数组是连续的数据集合。 假设您在index 1index 10处有值,其余的将由undefined填充。

您无法创建具有空值的数组。 ‘在你的意义上是空的’,不是未定义或null,它是空的:)

连续数据未定义意味着JavaScript中的默认分配。

假如你定义了一个变量,

 var X; console.log(X) //Undefined 

它不是nullnull是用户明确指定一种方法来告诉有空数据, undefined是JavaScript引擎方式。