Javascript 数组的内存分配

Javascript 数组的内存分配,javascript,Javascript,我想知道如果你有一个以高值开始的数组,是否有人知道如何使用JS数组处理内存 例如,如果您有: array[5000] = 1; 作为数组中的第一个值,5000之前的所有内容都不存在,分配给数组的内存量是否会满足它之前未分配的4999个位置。。。或者它将只为[5000]的数组中的值分配内存 我正试图减少脚本使用的内存量,因此我想知道以下问题:)当为5000第个键赋值时,并不是整个数组都被填充: var array = []; // Create array array[5000] =

我想知道如果你有一个以高值开始的数组,是否有人知道如何使用JS数组处理内存

例如,如果您有:

array[5000] = 1; 
作为数组中的第一个值,5000之前的所有内容都不存在,分配给数组的内存量是否会满足它之前未分配的4999个位置。。。或者它将只为[5000]的数组中的值分配内存


我正试图减少脚本使用的内存量,因此我想知道以下问题:)

当为
5000
第个键赋值时,并不是整个数组都被填充:

var array = [];     // Create array
array[5000] = 1;
'1' in array;       // false: The key does not exists
Object.keys(array); // 5000 (it's the only key)
如果要使用数组扩展新浏览器,请填充类型化数组:

var array = new ArrayBuffer(6e9); // 6 Gigs
两者都可以在Chrome中轻松验证:打开控制台和内存控制台(Shift+Esc),然后粘贴代码<代码>窗口.a=新数组(6e9)
窗口。a=[];窗口[6e9]=1不会导致内存显著增加,
window.a=newarraybuffer(6e9)使页面崩溃


PS.
6e9===600000000

Javascript实际上是由浏览器解释和运行的,因此它取决于浏览器如何实现此行为。理论上,一旦你做了数组[5000],你就有了一个5001个元素的数组,除了第5001个元素没有定义

虽然如果我是实现运行这样的脚本的逻辑的人,
undefined
将是默认值,如果没有分配给任何其他值,这意味着我可能可以定义一个映射,其中1个条目将键5000分配给值1。对数组中任何其他值的任何访问都将自动返回未定义的值,而无需执行不必要的工作


这是一个测试。正如你可以看到的,警报立即被看到。

JS数组实际上不是数组,正如你知道的,它们从C++、C++等其他编程语言中得到。这意味着当您定义

array[5000]=1时实际定义数组对象的5000属性

如果使用字符串作为数组键,则也可以将索引作为属性访问以演示此行为,但由于变量名不能以数字
数组开头。5000
将无效

array['key'] = 1;
alert( array.key ); // Gives you 1

这意味着阵列的实现可能与对象非常相似,尽管每个实现都可以自由优化,因此,除了可以定义
object.a
object.z
而不定义整个字母表的对象外,它还提供了您所需的行为。

@Rob W所以您是说它将为所有5000个键分配内存?Dave只保留第5000个键的内存,其他键不存在,而且没有为这些方法保留内存。@RobW因此本质上-数组可以像数据字典一样使用,而没有内存问题…?@Dave是的,但是使用对象文本而不是数组会更明智,因为您可能不需要这些闪亮的数组方法(
var x={};x[5000]=1;
var x=[];x[5000]=1;
). 另一个注意事项:键总是字符串
x[5000]
相当于
x['5000']
@Dave,因为您知道数组键总是整数,所以在一元数
+
前面加前缀就足够了:
+'1'==1
。没有副作用,另请参见:。