JavaScript数组索引基础知识

5

我不确定Javascript引擎(特别是浏览器引擎)如何存储数组。

例如,这将使用多少内存?

var x = new Array(0, 1, 2, 1000, 100000000);

我想将整数日期映射为数组索引,但我需要确保这不是一个坏主意。

1个回答

11

数组在只有一些特殊方面是“特殊”的:

  • 它们从其原型中获得了一些有趣的类似于数组的方法(如“slice()”等)
  • 它们具有一个“魔法”length属性,用于跟踪最大的数值属性“名称”

如果你在全新的数组中存储了一些值在位置10299123,则运行时不会使用所有内存来分配实际的空数组。相反,它会存储你想存储的任何内容,并确保length更新为10299124。

现在,特别是日期问题,如果你要存储时间戳,问题在于(我认为)它们比32位整数还要大。数组索引限制在该大小之内。但是,这只意味着length不正确。如果你真的不关心数组的任何东西,那么你只需要一个普通对象:

var dateStorage = {};

dateStorage[someDate.getTime()] = "whatever";

只要名称可以表示为字符串(对于数字来说显然是正确的),JavaScript对象可以用作名称-值映射。


谢谢。我希望能得到更多关于JS中数组存储的技术细节的回复。Unix时间戳是32位整数。 - Antony Carthy
1
JavaScript 数字类型的主题非常奇怪和复杂。ECMA 标准文档很长,很繁琐,但它确实有相当清晰(如果详细地)描述了语言语义。特别是数组描述对我来说相当简单明了。 - Pointy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接