我想知道它是否使用更多的内存来存储具有相同键的对象数组,而不仅仅是存储包含值的数组的数组。
const arrayOfObjects = [
{key1: "val1", key2: "val2", key3: "val4", key4: "val5"},
{key1: "value1", key2: "value2", key3: "value4", key4: "value5"},
{key1: "value-1", key2: "value-2", key3: "value-4", key4: "value-5"}
]
const arrayOfArrays = [
["val1", "val2", "val3", "val4"],
["value1", "value2", "value3", "value4"],
["value-1", "value-2", "value-3", "value-4"]
]arrayOfObjects会比arrayOfArrays占用更多的内存吗?更准确地说,密钥是否也存储在内存中?此外,我经常使用JS对象来创建哈希表,以加速算法,但这样做的限制是什么?谢谢你的帮助。
发布于 2020-07-31 08:19:23
JavaScript本身并没有指定对象的内存布局,但是所有常见的实现都使用类似于object shapes of the V8 engine的东西。由于所有对象都具有相同的形状,因此它们的属性名称将只存储一次,并由数组中的所有对象共享,无论有多少对象。与数组相比的开销,如果有的话,在算法/数据结构设计中是不值得考虑的。
我经常使用JS对象来制作哈希表,以加速算法,但这样做的限制是什么?
如果您动态添加了太多的属性,甚至是delete属性,引擎将使用不同的对象表示。然而,对于哈希表,你应该使用现代javascript中的Map,它从一开始就针对这个用例进行了优化,而且比对象更有效。
发布于 2020-07-31 04:23:55
与C等语言中在编译时解析的结构成员名称不同,JavaScript属性名称是动态的,并且可以在运行时更改。所以它们必须存储在对象的内存中。JavaScript对象通常实现为哈希表,其中属性名称作为表中的字符串键。
但是,如果在多个对象中使用相同的属性名称,则通常只有该字符串的一个副本,该副本由所有对象共享。参见Do common JavaScript implementations use string interning?。因此,字符串存储在内存中,但不会为每个对象复制。
实现对象的代码是高度优化的,因为您对它们的使用是典型的,并且需要高性能。
https://stackoverflow.com/questions/63180696
复制相似问题