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

She*_*zod 75 javascript android javascript-objects android-webview

所以我们有一个案例,我们会有一些JSON,其中key是id(int),值是字符串.但是我们注意到大多数时候,我们根据字符串查找id,所以我们决定将其反转并将字符串作为键,值为id.因为这样而不是遍历每个项目并比较值,我们可以这样做var id = storage[text];.以下是我们所做的例子.

这是旧实现的示例:

var storage = {
  0 : null,
  1 : "Hello",
  2 : "world!",
  3 : "How are you?"
}
Run Code Online (Sandbox Code Playgroud)

以下是新实现的示例:

var storage = {
  "null" : 0,
  "Hello" : 1,
  "world!" : 2,
  "How are you?" : 3
}
Run Code Online (Sandbox Code Playgroud)

我知道现在字符串是键,并且可以为相同的字符串获取相同的id.但是从现在开始字符串可能非常巨大(机会很小,但每个字符串可能最大1KB),JS或Android webview是否存在长度限制对象键?

而且,这种实施有缺点吗?到目前为止我没有发现任何问题,但你永远都不知道.

has*_*nge 82

我对此进行了一些研究.

MDN对此问题保持沉默,规范也是如此(ES5,ES6).他们只声明属性访问者必须是一个字符串,没有任何资格 - 换句话说,就规范而言,没有限制.这并不奇怪.

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

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

  • 现代浏览器上长键的任何*运行时*惩罚? (15认同)
  • ES7规范指定[限制为2 ^ 53 - 1的"元素"](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-ecmascript-language-types-string-类型).但我认为它受堆最大大小的限制 (6认同)
  • "*MDN对此问题保持沉默......*".[不再是](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length).;-) (6认同)
  • 因此实际大小为2 ^ 27 = 0.125 GB和2 ^ 30 = 1 GB。对我来说足够了:) (2认同)

Rid*_*lly 31

不,字符串长度没有限制(只要它适合内存),你的实现似乎也没关系.将这些"转向"数组与例如布尔值进行交换是很常见的.至于作为键的字符串:字符串是存储在某个地址的不可变符号,而实际用作数组索引的是该地址(也就是指针也称为引用),而不是字符串本身.

  • 在许多语言中,字符串是不可变的.Javascript就是其中一种语言.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures#Primitive_values (8认同)
  • "字符串是不可变的符号":你是从哪里学到的? (7认同)
  • 有趣.你可以添加一个参考或来源吗? (4认同)
  • 只是为其他人添加一些小的清晰度.这意味着您无法执行更改字符串的操作.你可以操纵并返回一个新的字符串,但从不真正改变它 (3认同)

Fra*_*iak 10

似乎在 ECMAScript 2016 中,这个问题现在有了明确的答案。根据关于 string.lengthMDN Web Docs

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

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

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