JS 对象中键(字符串)的长度是不是有限制?
Posted
技术标签:
【中文标题】JS 对象中键(字符串)的长度是不是有限制?【英文标题】:Is there a limit on length of the key (string) in JS object?JS 对象中键(字符串)的长度是否有限制? 【发布时间】:2012-11-02 06:35:02 【问题描述】:所以我们有一个对象,其中键是 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 对对象键有长度限制吗?
另外,这个实现有缺点吗?到目前为止我还没有发现任何问题,但你永远不知道。
【问题讨论】:
【参考方案1】:似乎有了 ECMAScript 2016,这个问题现在有了明确的答案。根据MDN Web Docs on string.length:
ECMAScript 2016 (ed. 7) 建立了 2^53 - 1 个元素的最大长度。以前没有指定最大长度。
你也可以在ECMAScript® 2016 Language Specification中找到这个指定:
String 类型是由零个或多个 16 位无符号整数值(“元素”)组成的所有有序序列的集合,最大长度为 253-1 个元素。
【讨论】:
【参考方案2】:我对此进行了一些研究。
MDN is silent 在这个问题上,规范也是如此(ES5,ES6)。他们只声明属性访问器必须是一个字符串,没有任何限制——换句话说,就规范而言,没有限制。这不足为奇。
浏览器如何处理它是另一回事。我已经设置了a test 并在多个浏览器中运行它。 Chrome 40 (Desktop)、Chrome 40 (android 5.1)、Firefox 36、Opera 27 和 IE9+ 可以处理最多 227 个字符的属性名称。 Safari 8 (OS X Yosemite) 甚至可以处理 230 个字符的属性名称。
对于除 IE 之外的所有浏览器,最大属性长度与最大字符串长度相同。 IE9+ 可以处理的最大字符串长度约为 230 个字符,但对象键的限制为 227 个字符,就像在其他浏览器中一样。
在 ios 上的 IE8 和 Safari 中测试不成功,可能是由于测试代码导致的内存问题。
简而言之,使用长属性名称是安全的,即使在极端情况下也是如此。只要字符串本身保持在浏览器可以处理的范围内,您也可以将它们用作属性名称。
【讨论】:
现代浏览器上长键的任何 runtime 惩罚? @AhmedFasih 我没有测试过,所以我不确定。如果有性能损失,我认为这与比较长字符串有关。如果在实践中存在重要的问题,我会感到惊讶 - 除非键是 huge 且数量众多并且您开始遇到内存限制,例如在移动设备上。 ES7 规范指定a limit of 2^53 - 1 of "elements"。但我认为它受到堆最大大小的限制 “MDN 对这个问题保持沉默……”。 Not any more。 ;-) 所以实际大小是 2^27 = 0.125 GB 和 2^30 = 1 GB。这对我来说已经足够了:)【参考方案3】:不,字符串长度没有限制(只要它适合内存),而且您的实现似乎也不错。将那些“转过身”的数组与例如布尔值。 至于字符串作为键:字符串是存储在某个地址的不可变符号,实际用作数组索引的是该地址(又名指针又名引用)而不是字符串本身。
【讨论】:
有趣。您能否添加参考或来源? 在许多语言中,字符串是不可变的。 javascript 就是其中一种语言。 developer.mozilla.org/en-US/docs/Web/JavaScript/… 只是为其他人添加一些小的清晰度。这意味着您不能执行更改字符串的操作。你可以操作并返回一个新字符串,但永远不要真正改变一个 接受的答案更实用,但这是真正的答案。以上是关于JS 对象中键(字符串)的长度是不是有限制?的主要内容,如果未能解决你的问题,请参考以下文章