当前位置: 首页 > 面试题库 >

JavaScript与Java中数组中未初始化的项目之间有什么区别?

令狐嘉运
2023-03-14
问题内容

我只是在玩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。您只是没有在index处分配元素3,所以什么也没有。

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

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

因为数组是分配的内存的大块,所以当分配大小为4的数组时,其所有元素均从该内存位置获取其值。为了避免不确定的值,在某些语言/场合中,字段通常使用进行默认初始化0



 类似资料:
  • 问题内容: 我为程序使用了HashMap,它运行良好,但是我不理解HashMap的这些初始化之间的区别。 假设我正在实现一个HashMap,以字符作为键,并以整数作为值。这些有什么区别? 问题答案: 任何涉及或不涉及类型实参的内容(尖括号<和>及其之间的部分)都是原始类型,不应使用。原始类型不是通用类型,可以让您做不安全的事情。 “正确”的方法是 第一种使用接口Map作为参考类型。它通常比较惯用,

  • 问题内容: 所以我要声明并初始化一个int数组: 说我改为这样做… … 0将按标准输出。另外,如果我这样做: 将按标准输出。那么默认如何初始化我的数组?是否可以安全地假设默认的初始化将数组索引设置为零,这意味着我不必遍历数组并对其进行初始化? 问题答案: Java程序中未由程序员明确设置为所有内容的所有内容都初始化为零值。 对于的引用(任何包含对象的内容)。 对于int / short / byt

  • 最近,当我在LeetCode上做一些练习时,我发现了一些绝妙的解决方案。它使用对象o引用数组,我猜可能是因为在Java,所有的东西都是Object。但当我尝试这种方法时,它出错了。所以我尝试了所有的方法来初始化数组,我想看看它们之间的区别,就像下面这样 只有o3会编译一个错误。我不知道是不是因为初始化的方式。我知道当我使用静态初始化时,它会先分配内存,当使用动态初始化时,它不会。它们之间的其他差异

  • 问题内容: 我知道当我初始化一个char数组时: 要么 为什么不喜欢 初始化数组: 为什么它们不同?它是Java哲学的本质之一还是其​​背后的某些原因? 问题答案: 如果您曾经使用过 C ,那么答案就非常简单。在 C语言中 ,创建数组的方式是在堆栈上分配一个足以容纳元素数量的静态内存长度,并使用指针指向第一个元素-或堆上动态内存长度,然后用指针指向第一个元素。 在 C ++中 ,第二个版本已更改为

  • 初始化的区别是什么:1)int i=47;或2)int i;{i=47;在哪些情况下我们需要第一个或第二个?

  • 问题内容: 我有这个代码: 这会导致编译错误:可能尚未初始化,这很公平。 现在,我将代码更改为: 我得到同样的编译错误!我必须初始化为null: 那么,不初始化对象和初始化为null有什么区别?如果我声明一个没有初始化的对象,它是否为null? 谢谢 问题答案: 字段(成员变量)被初始化为(或初始化为默认的原始值,如果它们是原始的) 局部变量未初始化,您有责任设置初始值。