我想知道如果您有一个以高值开头的数组,是否有人知道如何使用 JS 数组处理内存。
例如,如果您有:
array[5000] = 1;
作为数组中的第一个值,5000 之前的所有内容根本不存在,分配给数组的内存量是否会满足它之前未分配的 4999 个位置......或者它是否只会将内存分配给数组中的值[5000] ?
我试图减少我的脚本使用的内存量,所以这让我想知道这个问题:)
我想知道如果您有一个以高值开头的数组,是否有人知道如何使用 JS 数组处理内存。
例如,如果您有:
array[5000] = 1;
作为数组中的第一个值,5000 之前的所有内容根本不存在,分配给数组的内存量是否会满足它之前未分配的 4999 个位置......或者它是否只会将内存分配给数组中的值[5000] ?
我试图减少我的脚本使用的内存量,所以这让我想知道这个问题:)
将值分配给5000
th 键时,不会填充整个数组:
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
JS 数组实际上不是您从其他编程语言(如 C、C++ 等)中了解的数组。它们是具有类似数组访问方式的对象。这意味着,当您定义时,array[5000] = 1;
您实际上定义了数组对象的 5000 属性。
如果您使用字符串作为数组键,您也可以将索引作为属性访问以演示此行为,但由于变量名称不能以数字开头,array.5000
因此将是无效的。
array['key'] = 1;
alert( array.key ); // Gives you 1
这意味着数组可能会像对象一样实现,尽管每个实现都可以自由优化,从而为您提供除了您可以定义的对象object.a
和object.z
不定义整个字母表的行为之外的行为。
Javascript实际上是由浏览器解释和运行的,所以它取决于浏览器如何实现这种行为。理论上,一旦你执行了array[5000],你就有了一个包含 5001 个元素的数组,除了第 5001 个元素是未定义的。
虽然如果我是实现运行此类脚本的逻辑的undefined
人,如果没有分配给其他任何东西,这将是默认值,这意味着我可能可以定义一个带有 1 个条目的映射,将键 5000 分配给值 1。任何访问任何数组中的其他值将自动返回未定义,而无需做不必要的工作。
这是一个测试here。如您所见,警报会立即显示。