JavaScript数组大小和未定义的值

JavaScript数组大小和未定义的值,javascript,arrays,Javascript,Arrays,考虑以下示例: 代码: var array = []; array[4] = "Hello World"; [undefined, undefined, undefined, undefined, "Hello World"] 结果: var array = []; array[4] = "Hello World"; [undefined, undefined, undefined, undefined, "Hello World"] 仅仅声明您希望值驻留在数组中的位置看起来效率很低。考

考虑以下示例:

代码:

var array = [];
array[4] = "Hello World";
[undefined, undefined, undefined, undefined, "Hello World"]
结果:

var array = [];
array[4] = "Hello World";
[undefined, undefined, undefined, undefined, "Hello World"]
仅仅声明您希望值驻留在数组中的位置看起来效率很低。考虑大数组(100000多个索引)

这实际上是在JavaScript中对数组的低效使用,还是数组的处理方式使n个索引实际上没有声明
未定义
?(也就是说,这只是为了说明空索引而打印出来的吗?)


注意:这个问题的建议副本是错误的。这与基于零的索引无关。我已经知道数组从0开始

JavaScript数组就是这样工作的。声明新数组时:

var arr = [];
长度将为
0
。而且不会有任何元素

如果在第5个索引处插入:

arr[5] = 10;
然后,JavaScript引擎用
未定义的值填充前面的数字索引。从而使数组长度为
6
而不是
1
。如果您看到数组内容,它将是:

arr => array(
    undefined,
    undefined,
    undefined,
    undefined,
    undefined,
    10
)
我已经就此提出了一个问题,但我找不到。问题是:

从上述问题中复制已接受的答案:

.length
被定义为大于最大数值索引的值。(它不仅仅是“数字”;它是32位整数值,基本上是数字属性。)

相反,将
.length
属性设置为某个数值(例如,在您的示例中为
6
)会删除属性名称大于或等于您设置的值的属性


你的假设是正确的。JS数组是对象和数组声明,如

a = ['a','b','c']
这只是一条捷径

a = {
   "0": "a",
   "1": "b",
   "2": "c"
}
分别为,
a=[];[4]=“foo”

a = {
  "4": "foo"
}
您在控制台中看到的一堆未定义的
s只是控制台如何转储数组的一个工件,它们实际上并不存在

数组和普通对象之间的唯一区别是数组有一个“length”属性,它是以一种特殊的方式处理的<代码>长度始终等于迄今为止分配的最大数值索引加上一:

a = [];
a[100] = 'x';
a.length; // 101

注意:我说的是标准中描述的“理想”JS实现,具体的实现可能会以不同的方式提供后台优化和存储阵列。

内部结构的处理方式将完全取决于JavaScript解释器,这将定义内部结构是否以低效的方式处理

我的简化假设是,实际上导致打印出数组是发现这些未定义项的唯一点。基本上,这意味着只有通过访问才能发现这些特定索引的值
未定义
(即未分配)。(在我看来)以下几点基本上是不同的:

关于:

var a = []; for ( var i=0; i<=99; i++ ) { a[i] = undefined; } a[100] = 1;

var a=[];对于(var i=0;我在chrome控制台上检查,
var a=[];a[5]=10;a[2];
//此处未定义。@fuyushimoya更正了它。@PraveenKumar的精确副本-这不是重复的。我知道索引是基于零的!-检查这个已接受的答案。你看到第一个答案了吗?@veeprankumar我看到了,但你的“精确副本”这是另一个问题。