因此,我们有一个对象,其中键是 id (int),值是字符串。但我们注意到,大多数时候,我们是根据字符串来查找 id 的,所以我们决定反转它,让字符串作为键,值作为 id。因为这样我们就可以直接做
var id = storage[text];
,而不是遍历每个项目并比较值。以下是我们所做的示例。
这是旧实现的示例:
var storage = {
0 : null,
1 : "Hello",
2 : "world!",
3 : "How are you?"
}
这是新实施的示例:
var storage = {
"null" : 0,
"Hello" : 1,
"world!" : 2,
"How are you?" : 3
}
我知道现在字符串是关键,可以为相同的字符串获取相同的 id 。但由于现在字符串可能非常大(可能性很小,但每个字符串可能最大 1KB),JS 或 Android webview 对对象键是否有长度限制?
此外,这种实现有缺点吗?到目前为止我还没有注意到任何问题,但你永远不知道。
我对此进行了一些研究。
MDN 在这个问题上保持沉默,规范也是如此(ES5、ES6)。他们只是声明属性访问器必须是字符串,没有任何限定——换句话说,就规范而言没有任何限制。这并不奇怪。
浏览器如何处理它是另一回事。我已经设置了一个测试并在多个浏览器中运行它。 Chrome 40(桌面版)、Chrome 40 (Android 5.1)、Firefox 36、Opera 27 和 IE9+ 可以处理最多 227 个字符的属性名称。 Safari 8 (OS X Yosemite) 甚至可以处理 230 个字符的属性名称。
对于除 IE 之外的所有浏览器,最大属性长度与最大字符串长度相同。 IE9+ 可以处理的最大字符串长度为 ~230 个字符,但对象键的限制为 227 个字符,就像其他浏览器一样。
该测试在 iOS 上的 IE8 和 Safari 中不起作用,大概是由于测试代码导致的内存问题。
简而言之,使用长属性名称是安全的,即使在极端情况下也是如此。只要字符串本身不超出浏览器可以处理的范围,您也可以将它们用作属性名称。
不,字符串长度没有限制(只要它适合内存),并且您的实现似乎也不错。实际上,将这些“翻转”数组与例如布尔值。 至于作为键的字符串:字符串是存储在某个地址的不可变符号,实际用作数组索引的是该地址(又名指针又名引用),而不是字符串本身。
似乎在 ECMAScript 2016 中,这个问题现在有了明确的答案。根据 MDN Web 文档 on string.length:
ECMAScript 2016(第 7 版)建立了 2^53 - 1 个元素的最大长度。以前,没有指定最大长度。
您还可以在 ECMAScript® 2016 语言规范中找到此指定:
String 类型是零个或多个 16 位无符号整数值(“元素”)的所有有序序列的集合,最大长度为 253-1 个元素。
JS中的对象是哈希表的一种。 如果我们以 MD5 为例:
MD5 哈希值是通过任意长度的字符串和 将其编码为 128 位指纹。使用编码相同的字符串 MD5 算法将始终产生相同的 128 位哈希输出。
只需打开 MD5 哈希生成器并输入您想要的任何值,输出长度将是相同的,例如:
'a' => 0cc175b9c0f1b6a831c399e269772661
'veryLongKeyValue' => ad95db1c5d8abcee81fee5f1f1ded641
这就是为什么我们可以在对象中拥有很长的键。 另一个是引擎实现的问题。