ECMAScript/JavaScript字符串中的每个字符消耗多少RAM?

ECMAScript/JavaScript字符串中的每个字符消耗多少RAM?,javascript,string,Javascript,String,问题很简单:ECMAScript/JavaScript字符串中的每个字符消耗多少RAM(以字节为单位) 我猜两个字节,因为标准上说它们存储为16位无符号整数 这是否意味着每个字符总是两个字节?是的,我认为是这样。这些字符可能存储为宽字符串或UCS2字符串。 它们可能是UTF-16,在这种情况下,对于BMP(基本多语言平面)之外的字符,每个字符占用两个字(16位整数),但我相信这些字符并不完全受支持。请阅读ECMA的UTF16实现 大多数现代语言用两字节字符存储字符串。这样,您就可以完全支持所有口

问题很简单:ECMAScript/JavaScript字符串中的每个字符消耗多少RAM(以字节为单位)

我猜两个字节,因为标准上说它们存储为16位无符号整数


这是否意味着每个字符总是两个字节?

是的,我认为是这样。这些字符可能存储为宽字符串或UCS2字符串。 它们可能是UTF-16,在这种情况下,对于BMP(基本多语言平面)之外的字符,每个字符占用两个字(16位整数),但我相信这些字符并不完全受支持。请阅读ECMA的UTF16实现

大多数现代语言用两字节字符存储字符串。这样,您就可以完全支持所有口语。它需要一点额外的内存,但对于任何一台具有多千兆RAM的现代计算机来说,这都是微不足道的。将字符串存储在更紧凑的UTF8中会导致处理更复杂、更慢。因此,UTF8主要用于运输。ASCII仅支持不带变音符号的拉丁字母。ANSI仍然有限,需要指定的代码页才能理解

的第4.13.16节明确将“字符串值”定义为“原始值,它是零或多个16位无符号整数的有限有序序列”。它建议程序使用这些16位值作为UTF-16文本,但使用字符串存储任何不可变的无符号短数组是合法的


请注意,字符大小并不是组成字符串大小的唯一因素。我不知道具体的实现(可能会有所不同),但字符串往往有一个0x00终止符,以使它们与PChars兼容。它们可能有一些包含字符串大小的头,可能还有一些重计数甚至编码信息。带有一个字符的字符串很容易消耗10个字节或更多字节(是的,即80位)。

我假设这取决于您使用的字符集上下文。我不确定这是否是(或属于)语言标准。为什么你删除了你的最后一个(非常有趣!)问题,而不是添加你在哪个浏览器中测试的信息?@Pekka:我真的不知道该怎么说角色集。若我有一个通过V8引擎运行的JavaScript源文件,那个么在什么时候指定了一个字符集?我相信JS源文件是使用与strings.ahh相同的字符集来解释的。我指的是浏览器中的JS——从你的上一个问题来看,我也这么认为。@rFactor,至于源代码编码,ECMA-262(在第6章的开头)明确指出(在解释之前),支持UTF-16以外的源代码编码的实现必须表现为源代码被转换成UTF-16。@Henning:这是有道理的。谢谢。“ECMA中的字符串总是使用Unicode”Unicode,这意味着我提到的(受损的)UTF16实现。将这些字符串放入HTML文档时,浏览器的HTML/XMLdocument将根据需要转换此字符串。BMP中的字符在UTF-16或UCS2中是否只需要1个字节?UTF-8呢?字节、代码单位和代码点之间有区别。Unicode大约有110万个代码点,其中ASCII有128个。ANSI和UTF8的代码单位为1字节,其中UTF-16为2字节。这意味着UTF16中的每个字符占用2字节或2字节的倍数。在UTF-16和UCS2中,BMP中的字符占用1个代码单位(2字节)。事实上,我相信UCS2和UTF-16对于BMP中的字符是相同的,但是UTF-16支持BMP之外的字符,尽管这些字符占用多个代码单元。如果有人想读点书,请阅读“每个开发人员都应该知道的关于unicode的绝对最小值”。这非常有趣,而且从这一页上学习要比从我在这里的评论中写的一个简单的概要中学习要容易得多:@Pekka,语言规范明确表示字符串中每个元素16位。我对答案加了一个参考。(原则上,实现可以选择在内部将字符串存储为UTF-8,除非这会使
charAt()
的实现复杂化)。