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


84

因此,我们有一个对象,键是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?

而且,此实现是否有缺点?到目前为止,我还没有发现任何问题,但是您永远不会知道。

Answers:


96

我对此进行了研究。

MDN对此问题保持沉默,而规范(ES5ES6也保持沉默。它们仅声明属性访问者必须是字符串,且没有任何限定条件-换句话说,就规范而言,没有限制。这不足为奇。

浏览器如何处理它是另一回事。我已经建立了一个测试,并在许多浏览器中运行它。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中运行,可能是由于测试代码引起的内存问题。

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


17
任何运行12年的现代浏览器长的密钥?
艾哈迈德·法西

@AhmedFasih我没有测试过,所以我不确定。如果有性能损失,我认为这与比较长字符串有关。如果在实践中遇到重要问题,我会感到惊讶-除非键很大且很多,并且您开始遇到内存限制,例如在移动设备上。
hashchange

7
ES7规范指定“元素”的限制为2 ^ 53-1 。但我认为它受堆最大大小的限制
记忆

6
MDN在此问题上保持沉默…… ”。没有了。;-)
RobG

2
因此实际大小为2 ^ 27 = 0.125 GB和2 ^ 30 = 1 GB。对我来说足够了:)
Sorin C

34

不,字符串长度没有限制(只要它适合内存),您的实现也可以。在那些带有“布尔值”的数组“翻转”的情况下,这是非常普遍的。关于作为键的字符串:字符串是存储在特定地址的不可变符号,实际上用作数组索引的是该地址(即指针,又称为引用),而不是字符串本身。


7
“字符串是不可变的符号”:您从哪里学到的?
安德鲁

4
有趣。您能否添加参考或来源?
hashchange'3

8
在许多语言中,字符串是不可变的。Javascript是其中的一种语言。developer.mozilla.org/en-US/docs/Web/JavaScript/...
hartz89

3
只是为其他人增加一些轻微的清晰度。这意味着您无法执行更改字符串的操作。您可以操纵并返回一个新字符串,但实际上不能更改任何字符串
Patrick

可接受的答案更实际,但这是真正的答案。
theUtherSide

5

似乎在ECMAScript 2016中,对于此问题有了明确的答案。根据有关string.lengthMDN Web文档

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

您还可以在ECMAScript®2016语言规范中找到指定的内容:

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.