1

我正在为游戏构建一个实体系统,基本上我不确定是否应该使用简单的对象(字典)或数组来通过它们的 id 来存储实体/组件。

我最大的问题是我不想要动态实体 ID。如果 id 只是一个字符串(使用字典存储实体),那么它总是有效的,我可以使用 storage[id] 来获取该实体。

如果我使用数组,我想,表示存储数组中索引的实体的 id会改变。考虑这个实体数组:

[
    Entity,
    Entity, //This one is being removed.
    Entity
];

如果我要删除该数组中的第二个实体,我认为访问第三个数组所需的 id 必须更改为(现已删除)第二个实体的 id(索引)。那是因为我考虑过删除splice()ing。

但是,我可以使用delete表达式将元素(实体)转换为undefined! 而且,如果 Javascript 中的数组实际上只是对象,并且对象在逻辑上具有无限多的未定义值,这是否意味着数组中的未定义值不会占用内存?

最初,我认为数组的实现方式是它们在内存中对齐,并且索引只是从第一个元素的偏移量,并且按照这种逻辑,我认为未定义的值至少会使用指针的内存(因为我实际上认为指向元素的指针是对齐的,而不是元素本身)。

那么,如果我在这个数组中存储了 10k+ 个实体,并delete编辑了其中的一半,那么 5kundefined会使用任何内存吗?

另外,当我做一个for entity in array循环时,这些未定义的元素会被传递吗?

另外,我在哪里可以找到资源来查看数组实际上应该如何在 Javascript 中实现?我所能找到的只是数组的一般解释和有关如何使用它们的教程,但我想了解这些在某些情况下可能很重要的小怪癖。像“Javascript quirks”这样的网站会很棒。

4

1 回答 1

2

数组不仅仅是对象。尤其是length属性非常神奇。

当然,只要外部 API 保持不变,JavaScript 引擎就可以在内部以它选择的任何方式表示数组。例如,如果您设置随机分隔的值,则它们可能会存储为哈希,但如果您设置连续值,则它们可能会优化为数组。

for ... in不枚举未设置的属性。这包括一个跳过值的数组文字,例如[true, , false],它只会枚举索引 0 和 2。

于 2012-07-21T22:04:10.060 回答