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

所以我们有一个情况,我们会有一些JSON,其中键是id(int),值是string。 但是我们注意到大多数时候,我们都是根据string来查找id,所以我们决定将其逆转,并将string作为键,值就是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 } 

我明白,现在string是关键,可以为相同的string获取相同的ID。 但是从现在开始,string可能会非常大(很小的机会,但是每个string最大可能为1KB), 那么JS或Android webview将长度限制放在对象键上吗?

而且,这个实现有缺点吗? 到目前为止,我还没有注意到任何问题,但你永远不知道。

Solutions Collecting From Web of "JS对象中的键(string)的长度是否有限制?"

不,对string长度没有限制(只要它适合于内存),并且你的实现似乎也可以。 那些使用例如布尔值“转向”数组的操作非常常见。 而对于string作为关键字:string是存储在某个地址的不可变符号,实际用作数组索引的是该地址(又名指针又称为引用),而不是string本身。

我已经研究了一下。

MDN对这个问题保持沉默 ,规范也是如此( ES5 , ES6 )。 他们只是说,财产访问者必须是一个string,没有任何资格 – 换句话说,就规格而言没有限制。 这并不奇怪。

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

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

这个testing在IE8和iOS上的Safari上不起作用,大概是由于testing代码引起的内存问题。

简而言之,使用长名称是安全的,即使在极端情况下也是如此。 只要string本身保持在浏览器可以处理的范围内,也可以将它们用作属性名称。