Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— js数据类型:String #46

Open
lizhongzhen11 opened this issue Oct 12, 2019 · 0 comments
Open

重学js —— js数据类型:String #46

lizhongzhen11 opened this issue Oct 12, 2019 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented Oct 12, 2019

String 类型

String 类型是所有0个或多个16位无符号 整数 值组成且最大长度为 253 - 1 的有序序列集合。

String类型通常用于表示正在运行的ECMAScript程序中的文本数据,字符串中的每个元素被当作 UTF-16 码元值处理。每个元素被认为在序列中占据一个位置。这些位置用非负整数索引。第一个元素下标为 0((即下标从0开始)),下一个元素下标为 1,依此类推。字符串长度是字符串中的元素数量。空字符串长度为0且不包含元素。

解释字符串值的操作将每个元素视为单个UTF-16码元。但是,ECMAScript不限制这些码元的值或它们之间的关系,因此,将字符串内容进一步解释为以 UTF-16 编码的 Unicode 码点序列的操作必须考虑格式错误的子序列。这样的操作会对数值范围在 0xD8000xDBFF (由Unicode标准定义为 主要代理,或更正式地定义为高代理码元)范围内的每个码元都进行特殊处理,且每个数值在 0xDC000xDFFF (定义为 尾代理,或更正式的定义为 低代理码元)范围内的码元使用以下规则:

  • 既不是 主要代理 又不是 尾代理 的码元被解释为具有相同值的码点
  • 两个码元的序列,如果第一个码元 c1主要代理 且第二个码元 c2尾代理,会组成一个 代理对,被解释为码点,其值为 (c1 - 0xD800) × 0x400 + (c2 - 0xDC00) + 0x10000 (见 UTF16DecodeSurrogatePair)。
  • 属于 主要代理尾代理 但又不属于 代理对 的码元,被解释为具有相同值的码点

String.prototype.normalize 能显式规范字符串值。String.prototype.localeCompare 在内部对String值进行规范化,但是在其运算时没有其他操作隐式地规范字符串。

注意:这种设计的基本原理是使Strings的实现尽可能简单和高性能。如果ECMAScript源文本为规范化格式C,保证字符串文字也可以规范化,只要它们不包含任何Unicode转义序列。

在该规范中,"the string-concatenation of A, B, ..."(其中每个参数是一个字符串值,一个码元或码元序列)表示字符串值是每个参数的码元 顺序的串联形成码元序列。

String 值

字符串值是基本值,它是零个或多个16位无符号 整数 值的有限有序序列。

注意:序列上的每个 整数 值通常表示UTF-16文本的一个单个16位单元。但是,ECMAScript对值没有任何限制或要求,只不过它们必须是16位无符号整数。

String 字面量

注意:字符串字面量是以单引号或双引号括起来的0个或多个 Unicode 码点。Unicode 码点也可以由转义序列表示。除结尾引号码点,U+005C(反斜杠)U+000D(回车符) 以及 U+000A(换行符) 外,所有码点都能以字符串形式显示。任何码点都能以转义序列的形式出现。字符串字面量的计算结果为ECMAScript字符串值。生成这些字符串值时,Unicode 码点按照 UTF16Encoding 中的定义进行UTF-16编码。属于 基本多文种平面 的码点被编码为字符串的单个代码单元。除此之外所有其它码点会被编码为字符串的两个代码单元。

字符串单字符转义序列
转义序列 代码单元值 Unicode字符名 符合
\b 0x0008 BACKSPACE (退格) <BS>
\t 0x0009 CHARACTER TABULATION (水平制表符) <HT>
\n 0x000A LINE FEED (LF 换行) <LF>
\v 0x000B LINE TABULATION (垂直制表符) <VT>
\f 0x000C FORM FEED (FF 换页) <FF>
\r 0x000D CARRIAGE RETURN (CR 回车) <CR>
\" 0x0022 QUOTATION MARK (双引号) "
\' 0x0027 APOSTROPHE (单引号) '
\\ 0x005C REVERSE SOLIDUS (反斜杠) \

疑问

"整数值(integer)"是什么意思?

规范中有说明:在本说明书中使用 integer 时,除非另有说明,否则是指 Number value 且它的数学值(mathematical value)在 整数集 中;在本说明书中使用数学整数(mathematical integer)时,是指在 整数集 中的数学值(mathematical value)。方便速记,integert 可以用来指代Number value或mathematical value中任何一个,用 t 来代替。

16位无符号是什么意思?

这里16位应该指的是16位二进制数;可以近似认为是 UTF-16编码
16位无符号整数代表不区分正负,那么其能表示Math.pow(2, 16)个数,即65536个,从0开始即:

// 二进制
00000000 00000000 ~ 11111111 1111111
// 对标十进制
0 ~ 65535

最大长度为何是Math.pow(2, 53) -1,依据是什么?

其实这个问题答案在于问题1 integerinteger 不管指代Number value还是mathematical value,都有个要求:mathematical value在整数集上。

什么是整数集?
所有整数组成的集合

这就涉及到ECMAScript的Number类型了。而Number类型可表示的最大安全值是9007199254740991Math.pow(2, 53) - 1。所以整数集中最大长度就是Math.pow(2, 53) - 1

ECMAScript要求string value中的每个值都必须是16位无符号整数,可是正常来说string里面既可以是数字也可以是英语字母、中文以及其他语言甚至特殊字符,这些东西都满足16位无符号整数这个要求吗?或者问题可以改为string到底是Unicode还是ASCII编码?

这个问题其实我一开始完全不懂编码,我都不知道unicode和ASCII编码有什么关系?而且当时看规范很吃力,没办法就去知乎问了下,链接:https://www.zhihu.com/question/350713984

先看winter的回答,他说的很对,其实我对字符集这些东西根本就不懂,理解起来也乱七八糟。。。

注意:string没有值,它是字符串,由一个个字符组成,字符有码点,码点才是16位无符号整数。

要继续往下面理解,就必须先懂字符码点相关知识,所以可以先看下面的链接:
#47

结论是采用 Unicode字符集(正如规范中多次提到那样)。ecma402 comparestrings

@lizhongzhen11 lizhongzhen11 added js基础 js基础 Good for newcomers and removed js基础 labels Oct 12, 2019
@lizhongzhen11 lizhongzhen11 changed the title js数据类型(三):String 重学js —— js数据类型(三):String Oct 18, 2019
@lizhongzhen11 lizhongzhen11 added the 重学js 重学js系列 规范+MDN label Jan 6, 2020
@lizhongzhen11 lizhongzhen11 changed the title 重学js —— js数据类型(三):String 重学js —— js数据类型:String Jun 4, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant