我想知道如果有一个以高值开头的数组,是否有人知道如何使用JS数组处理内存。
例如,如果你有:
array[5000] = 1;
作为数组中的第一个值,5000之前的所有内容根本就不存在,分配给数组的内存量是否适合于之前未分配的4999个位置...或者它只会将内存分配给值[5000]的数组?
我正在努力减少用于我的脚本的内存量,所以这让我想知道这个问题:)
答案 0 :(得分:2)
为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),然后粘贴代码。 window.a=new Array(6e9);
或window.a=[];window[6e9]=1;
不会导致显着的内存增加,
当window.a=new ArrayBuffer(6e9);
崩溃页面时。
PS。 6e9 === 6000000000
答案 1 :(得分:0)
Javascript实际上是由浏览器解释和运行的,因此它取决于浏览器如何实现此行为。从理论上讲,一旦你执行了数组[5000],就会有一个5001个元素的数组,除了5001个未定义之外。
虽然如果我是实现运行此类脚本的逻辑的那个,undefined
如果没有分配给其他任何东西,它将是默认值,这意味着我可能会定义一个带有1个条目的地图,分配密钥5000值1.对数组中任何其他值的任何访问都将自动返回undefined,而不必进行不必要的工作。
这是对此here的测试。如您所见,警报立即可见。
答案 2 :(得分:0)
JS数组实际上不是数组,因为您可以从其他编程语言(如C,C ++等)中了解它们。它们是具有数组的对象,就像访问它们一样。这意味着当您定义array[5000] = 1;
时,实际上定义了数组对象的5000属性。
如果您使用了字符串作为数组键,那么您也可以将索引作为属性来访问以演示此行为,但由于变量名称不能以数字array.5000
开头,因此无效。
array['key'] = 1;
alert( array.key ); // Gives you 1
这意味着数组可能会像对象一样实现,尽管每个实现都可以自由优化,从而为您提供除了可以定义object.a
和object.z
而无需定义的对象的行为。整个字母。