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

时间:2012-11-13 19:29:46

标签: javascript android android-webview javascript-objects

所以我们有一个案例,我们有一个对象,其中key是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 个答案:

答案 0 :(得分:70)

我对此进行了一些研究。

MDN is silent关于此问题,规范(ES5ES6)也是如此。他们只声明属性访问者必须是一个字符串,没有任何资格 - 换句话说,就规范而言,没有限制。这并不奇怪。

浏览器如何处理它,是另一回事。我已经设置了a test并在许多浏览器中运行它。 Chrome 40(桌面),Chrome 40(Android 5.1),Firefox 36,Opera 27和IE9 +可以处理最多2个 27 字符的属性名称。 Safari 8(OS X Yosemite)甚至可以处理2个 30 字符的属性名称。

对于IE以外的所有浏览器,最大属性长度与最大字符串长度相同。 IE9 +可以处理最大字符串长度~2 30 字符,但对象键的限制为2 27 字符,就像在其他浏览器中一样。

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

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

答案 1 :(得分:30)

不,字符串长度没有限制(只要它适合内存),你的实现似乎也没问题。将这些“转向”阵列与例如阵列一起使用是很常见的。布尔值。 至于作为键的字符串:字符串是存储在某个地址的不可变符号,实际用作数组索引的是该地址(也就是指针也称为引用),而不是字符串本身。

答案 2 :(得分:1)

对于ECMAScript 2016来说,现在似乎已经有了一个明确的答案。根据{{​​3}}:

  

ECMAScript 2016(第7版)建立的最大长度为2 ^ 53-1个元素。以前,没有指定最大长度。

您也可以在MDN Web Docs on string.length中找到此名称:

  

String类型是零个或多个16位无符号整数值(“元素”)的所有有序序列的集合,最大长度为2 53 -1个元素。