当前位置: 首页 > 知识库问答 >
问题:

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

和季
2023-03-14

所以我们有一个例子,我们会有一个对象,其中key是id(int),值是字符串。但我们注意到,大多数时候,我们根据字符串查找id,所以我们决定将其反转并使字符串成为key,值是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个答案

令狐灿
2023-03-14

似乎对于ECMAScript 2016,这个问题现在有了明确的答案。根据字符串上的MDN Web文档。长度:

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

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

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

吕德惠
2023-03-14

不,字符串长度没有限制(只要它适合内存),您的实现似乎也可以。使用例如布尔值的“反转”数组是非常常见的。至于作为键的字符串:字符串是存储在特定地址的不可变符号,实际用作数组索引的是该地址(又名指针又名引用),而不是字符串本身。

翁和正
2023-03-14

我对此做了一些研究。

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

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

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

该测试在IE8中不起作用,SafariiOS,可能是由于测试代码引起的内存问题。

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

 类似资料:
  • 如果我想将char数组中的前3个字符作为双精度字符进行解析,而忽略以下字符,那么我真的需要这样做吗? 难道没有一个像这样的函数允许您指定它应该搜索的数字的最大字符串长度吗? 编辑:我希望它打印(它目前这样做),而不是!

  • 问题内容: 我正在寻找一种方法来限制php中的字符串,并在字符串过长时在末尾添加…。 问题答案: 您可以使用类似于以下内容的东西:

  • 问题内容: 这个问题出现在Spring类中,该类具有相当长的类名称。类名长度的语言是否有限制? 问题答案: 在Java语言规范指出标识符的长度不受限制。 但是实际上,文件系统将限制生成的文件名的长度。

  • 我正在尝试使用pycrypto加密我的数据。我已经为此编写了以下代码。 但我的错误率越来越低 如何控制输入字符串?输入字符串可以是任意长度。

  • 问题内容: 我有以下几点: 有没有一种方法可以将字符串的长度限制为20个字符? 还有一个更好的问题是,如果超过20个字符,有没有办法我可以将字符串更改为截断并显示在末尾? 问题答案: 编辑 最新版本的报价过滤器。 您需要这样的 自定义过滤器 : 用法: 选项: 逐字(布尔)-如果为true,则仅按字数限制切入, max(整数)-文本的最大长度,切成此字符数, tail(字符串,默认值:“…”)-如