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我看到了,但你的“精确副本”这是另一个问题。