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 对象中键(字符串)的长度是不是有限制?的主要内容,如果未能解决你的问题,请参考以下文章

钥匙串中存储的字符串是不是有长度限制?

js字符串转数字长度限制|超过长度有误差

JUnit 是不是对您的班级名称有一些奇怪的 30 个字符长度限制?

输入框如何限制中英字符长度不等?

JS对文本框输入字符的限制

js cookie 存的对象,取出来怎么用