JS对象中的键(字符串)长度是否有限制?

112

我们遇到了一个情况,我们有一个对象,其键是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是否对对象键设置长度限制?

此外,这种实现有什么缺点吗?到目前为止,我还没有注意到任何问题,但你永远不知道。

3个回答

129

我对此进行了一些研究。

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个字符,就像在其他浏览器中一样。

测试在IE8和iOS上的Safari中无法工作,这可能是由于测试代码导致的内存问题。

简而言之,即使将其推向极端,使用长属性名称也是安全的。只要字符串本身保持在浏览器可处理的范围内,就可以将它们用作属性名称。


24
现代浏览器中长键是否会导致运行时惩罚? - Ahmed Fasih
1
@AhmedFasih 我还没有测试过,所以我不确定。如果有性能损失,我会认为它与比较长字符串有关。除非键是巨大且数量众多,并且您开始遇到内存限制(例如在移动设备上),否则我会感到惊讶,因为这些问题实际上并不重要。 - hashchange
8
ES7 规范指定了“元素”的上限为2^53 - 1(链接:http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types-string-type)。但我认为它受堆的最大大小限制。 - mems
6
"MDN在这个问题上没有表态..."。不再是这样了. ;-) - RobG
4
实际大小为2的27次方等于0.125 GB,而2的30次方等于1 GB。这对我来说已经足够了 :) - Sorin C

38

不,字符串长度没有限制(只要它适合内存),您的实现似乎也没问题。拥有那些“颠倒”的数组,例如布尔值,实际上是非常常见的。 至于将字符串作为键:字符串是不可变的符号,存储在某个地址,实际用作数组索引的是该地址(也称指针或引用),而不是字符串本身。


4
有趣。你能否添加一个参考来源吗? - hashchange
9
在许多编程语言中,字符串是不可变的。JavaScript就是其中之一。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Primitive_values - hartz89
4
这意味着您不能执行更改字符串的操作,但可以操纵并返回一个新的字符串,但实际上从不更改原有的字符串。为了让其他人更清楚明白,只需要做一些小的澄清。 - Patrick
1
被接受的答案更实际,但这才是真正的答案。 - theUtherSide

15
根据MDN Web文档关于string.length的内容,似乎在ECMAScript 2016中,现在有了一个明确的答案。引用MDN文档的话:“ECMAScript 2016(第7版)确定了2^53-1个元素的最大长度。以前没有指定最大长度。” 您还可以在 ECMAScript® 2016语言规范中找到这一规定:“字符串类型是所有有序的、由零个或多个16位无符号整数值(“元素”)组成的序列,最大长度为2的53次方-1个元素。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接