JavaScript字符串是如何成为一组整数值元素的呢?

64jmpszr  于 2023-02-21  发布在  Java
关注(0)|答案(4)|浏览(136)

来自MDN:
JavaScript的字符串类型用于表示文本数据。它是一组16位无符号整数值的“元素”。字符串中的每个元素在字符串中占据一个位置。第一个元素位于索引0,下一个元素位于索引1,依此类推。字符串的长度是其中元素的数量。可以使用字符串文字或字符串对象创建字符串。
当您说JavaScript String类型是一组16位无符号整数值的“元素”时,这意味着什么?
请解释为什么它是一系列整数值。

bmvo0sr5

bmvo0sr51#

16位无符号整数值是特定字符的表示,由于它是元素的 * 集合 *,因此您可以像处理列表一样,使用[]表示法获取字符串中的特定字符。

const string = 'john doe';
console.log(string[3]) // Will print 'n' as it is the 3rd index characters (starts at 0)
7kqas0il

7kqas0il2#

它只是意味着字符串是一个“类似数组”的对象,每个字符的可用方式与数组元素类似,每个字符都存储为一个UTF-16 value

// The following is one string literal:
let s = "ABCDEFG";

console.log(s);

// But it's also an array-like object in that it has a length and can be indexed
console.log("The length of the string is: ", s.length);
console.log("The 3rd character is: ", s[2]);

// And we can see that the characters are stored as separate UTF-16 values:
console.log(s.charCodeAt(2));
ngynwnxp

ngynwnxp3#

据我所知:
1.无符号表示不是+或-。

  1. 16位表示可以表示2^16个元素/字符。
    1.一组整数意味着使用多个整数(1或更多)表示字符串。
    因此,这意味着表示字符串,JavaScript使用一组数字(每个数字是2^16个数字中的一个,因为没有浮点数和正/负表示)。
    注意:要了解更多信息,请阅读UTF-16
    参考:* UTF-16 *(IBM)
smdncfj3

smdncfj34#

在Unicode中,每个符号都有一个关联的数字。例如,"A"65"a"97,等等。这些数字称为码位。具体取决于我们使用的编码(UTF-32、UTF-16、UTF-8、ASCII等),我们用不同的方式来表示/编码这些代码点。2我们用来编码这些代码点的东西叫做“代码单元”,或者MDN称之为“元素”。
当我们使用JavaScript时,我们对字符的UTF-16编码很感兴趣。这意味着要表示一个代码单元/“元素”,我们使用16位(两个字节)。对于“A”,“元素”表示为:

0000000001000001 // (16 bits, hence 0 padding)

有很多角色需要我们去表现(想想表情符号、中文、日文、韩文等,每个都有自己的码位),所以16位单独表示和编码所有这些字符是不够的。这就是为什么有时候一些码位使用两个码单元/元素编码。例如,😂具有码点128514,并且在UTF-16中由两个元素/码单元编码:

1101100000111101 1101111000000010

这两个代码单元/元素1101100000111101(十进制55357)和1101111000000010(十进制56834)编码表示😂128514的码位/“字符”。请注意两个代码单元都是正数的情况(未签名),和为整数UTF 16概述了将这些元素从元素形式转换为代码点形式的算法,反之亦然(参见此处的示例)。
所有这些意味着什么呢?这意味着像"😂"这样的字符串长度为2:

console.log("😂".length); // 2

当你访问字符串的索引时,你将访问该字符串的代码单元/“元素”:

// "😂" in UTF16 is "1101100000111101 1101111000000010"
// So "😂"[0] gives 1101100000111101 (in decimal 55357)
// So "😂"[1] gives 1101111000000010 (in decimal 56834)
console.log("😂"[0], "😂".charCodeAt(0)); // 1101100000111101
console.log("😂"[1], "😂".charCodeAt(1)); // 1101111000000010

相关问题