3.3.4 String

String类型表示文本字符串,它由0个或多个字符构成。

JavaScript使用UTF-16编码来表示一个字符。UTF-16编码以两个字节作为一个编码单元,每个字符使用一个编码单元或者两个编码单元来表示。在底层存储中,字符串是由零个或多个16位无符号整数构成的有序序列。例如,字符串'ab'的存储结构如图3-4所示。

图3-4 字符串'ab'的存储结构

在获取字符串长度时,返回的是字符串中包含的编码单元的数量。对于字符串'ab'而言,返回的长度是2。因为字符'a'和字符'b'均由一个编码单元表示,总和为2。前面介绍过,在UTF-16编码中,一个字符可能使用一个编码单元或者两个编码单元来表示。若字符串中包含需要使用两个编码单元表示的字符,那么获取字符串长度的结果可能不符合预期。例如下面的字符串:


01 '♡'.length; // 2

此例中,我们在获取字符“”的长度时得到的结果为2,而期望的结果可能为1。这是因为“”字符需要使用两个编码单元来表示,即32个二进制位。字符串''的存储结构如图3-5所示。

图3-5 字符串''的存储结构

此外,ECMAScript 2015规定了字符串允许的最大长度为253 - 1,该数值也是JavaScript所能安全表示的最大整数。