最近我不得不在大型索引处创建一个包含值的数组(由于插件限制)。 例如:
var names[100000] = "a";
var names[150000] = "b" ... and so on till 5 large indexes.
并且在所有值之间未定义names[100001] //undefined.
现在我怀疑是因为数组只有5个元素,但如果我这样做
names.length //it is 300001
它是一个大型数组。我没有迭代这个数组,也没有运行任何循环。我将直接通过数组中定义的索引获取值。
因此,这个结构会在浏览器上产生任何显着的性能差异,或者只要数组中的值数量少于其索引而不涉及迭代就可以使用它。
由于
答案 0 :(得分:2)
区分数组与普通对象的唯一区别是它的length
属性及其行为方式(当然还有一些特定于数组的方法)。 length
值只会随着某些操作而增加,例如设置数字属性或push
新元素。简而言之,这就是它。将属性100000
设置为值时,数组实际上不包含100000个元素,所有发生的事情都是您设置了一个属性和{{1}的值相应调整。
所以,不,它不会对性能产生很大影响,除非有人使用length
实际迭代数组。
答案 1 :(得分:-1)
您可以使用插件创建一个长度数组,并在本地使用对象来限制迭代。在应用了所有处理之后,将值复制到数组并将其发送到插件的函数。
保持具有所需长度的数组作为缓冲区
var buffer = new Array(20000);
在内部使用对象
var data = {};
为对象分配值
data[10001] = "foo";
对对象应用转换或数据处理后,将数据复制到缓冲区
for (key in data){
buffer[key] = data[key];
}
将缓冲区发送到插件。如果需要,可以清除数据。
通过这样做,您将不会比您处理的实际数据迭代更多。