对象中的属性名称如何存储在Javascript中?

nic*_*ckf 5 javascript memory google-chrome

我总是假设一个对象的键被存储为字符串,并且任何非字符串值都将被强制转换.因此,正是在这种假设下,在编写一些必须为数千个密钥存储一个小值的代码时,我将所有密钥转换为基数36:

// theKey is an integer
myMap[theKey.toString(36)] = theValue;
Run Code Online (Sandbox Code Playgroud)

然后,我决定看看我的假设是否真的正确,并使用Chrome的分析器来检查内存使用情况.这里大概是我运行的测试和内存使用情况:

window.objIntegers = {};
for (i = 100000; i--) window.objIntegers[i] = 'a';
// 786kb

window.objStrings = {};
for (i = 100000; i--) window.objStrings[i.toString(36)] = 'a';
// 16.7mb!

// and the same pattern but with:
key = i + .5;  // 16.7mb
key = i + '';  // 786kb
key = '0' + i; // 16.7mb
key = i + '0'; // 16.7mb
Run Code Online (Sandbox Code Playgroud)

显然,我的假设是关闭的.我想知道的是,它们是如何存储的,以及这种行为是标准的,还是只是Chromium/WebKit团队添加的一些额外技巧?

Tim*_*own 0

这是 Chromium 中的优化。我相信它具有启发式(这里提到过它)来确定内部存储属性的最有效方法。ECMAScript 规范规定的只是 JavaScript 和环境之间的接口,而没有说明暴露给 JavaScript 的对象如何在内部实现。