浏览器引擎是否会在大量重复出现的对象中压缩键名?

Raf*_*off 7 javascript

本着这两个问题的精神:

浏览器如何处理相同对象类型的大型数组,它们的键名是否以某种方式压缩在内存中?我曾经使用过一个图形库,并通过缩短对象的键名来获得性能提升,所以我有点坚持这种心态。如果我使用 1,000,000 个这样的对象的数组,似乎不会有什么不同:

[{
    "firstNameAsWrittenInID": Pete,
    "lastNameAsWrittenInID": Jenkins
},{
    "firstNameAsWrittenInID": Jane,
    "lastNameAsWrittenInID": Jenkins
},
...
{
    "firstNameAsWrittenInID": Johann,
    "lastNameAsWrittenInID": Abele
}]
Run Code Online (Sandbox Code Playgroud)

或 1,000,000 个此类对象的数组:

[{
    "f": Pete,
    "l": Jenkins
},{
    "f": Jane,
    "l": Jenkins
},
...
{
    "f": Johann,
    "l": Abele
}]
Run Code Online (Sandbox Code Playgroud)

尽管由于键名很长,第一个似乎应该使用大约两倍的内存?

pok*_*oke 5

你可以在这里谈论两件不同的事情。第一个,也是更简单的一个是JSON 字符串,即您例如从 Web 服务接收的数据。这是一个字符串,字符串中的所有内容都很重要,可以是 JSON 属性名称,甚至是空格。以减少网络负载的方式将其最小化是一个好主意(您也可以 gzip 数据以获得良好的效果)。

实际的字符串大小可能不会成为问题,因为您通常不会长时间保留 JSON 字符串。那是因为当你解析JSON 时,你会得到一个标准的 JavaScript 对象。

因此,您更有可能询问的是,具有较长属性名称的 JavaScript 对象是否比具有较短属性名称的 JavaScript 对象占用更多内存。答案显然是肯定的,因为您需要将信息放在某个地方。但这只是答案的一半;当您查看具有相同属性集的多个对象时,它会变得更有趣。

在这里,字符串实习开始发挥作用。好的 JavaScript 引擎会对字符串使用字符串实习,因此在包含一个字符串后"firstNameAsWrittenInID",每个其他包含相同值的字符串都应该能够重用该实习字符串对象,从而减少内存占用。所以在这种情况下,重用长字符串或短字符串没有区别。

当然,原始字符串需要存储一次,所以如果你有很多不重复的长属性,最好以某种方式缩短它们。但是如果您一直重用属性名称,这很可能不会导致任何额外的内存开销。