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个元素视为null
或0
如果我们将数组大小增加到4以上?
为什么我在JavaScript中看到这种奇怪的行为,而在其他语言中却看不到?
为什么JavaScript中出现这种奇怪的行为?
因为数组只是对象。 如果您访问一个不存在的属性,则返回undefined
。 你根本没有在索引3
处分配一个元素,所以什么都没有。
通过分配更高的索引来自动生成arrays不会改变此行为。 它会影响.length
属性,是的,但中间索引将不存在。 这称为稀疏数组 。
为什么Java / C / C ++中出现这种奇怪的行为?
因为数组是已分配内存的块,并且在分配大小为4的数组时,其所有元素都从该内存位置获取它们的值。 为避免不确定的值,在某些语言/场合中,字段将默认初始化,通常为0
。
JavaScript不是强类型语言。
在Java中,您声明了一个整数数组。 该数组中任何元素的默认值为0。
在JavaScript中,当您声明一个数组时,默认值是未定义的,因为它可以包含任何东西,数字,字符串,任何对象(包括另一个数组)。 JavaScript数组的所有元素不必是同一类型。
数组是连续的数据集合。 假设您在index 1
和index 10
处有值,其余的将由undefined
填充。
您无法创建具有空值的数组。 ‘在你的意义上是空的’,不是未定义或null,它是空的:)
连续数据未定义意味着JavaScript中的默认分配。
假如你定义了一个变量,
var X; console.log(X) //Undefined
它不是null
。 null
是用户明确指定一种方法来告诉有空数据, undefined
是JavaScript引擎方式。