Javascript数组中未定义的值是否使用任何内存或在for in循环中迭代

Do undefined values in Javascript arrays use any memory or get iterated over in a for-in loop?

本文关键字:for 内存 in 迭代 循环 任何 未定义 数组 是否 Javascript      更新时间:2023-12-17

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

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

我想,如果我使用数组,实体的id(表示存储阵列中的索引)会发生变化。考虑以下实体阵列:

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

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

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

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

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

此外,当我执行for entity in array循环时,会传递这些未定义的元素吗?

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

数组不仅仅是对象。特别是length属性非常神奇。

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

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