@@ -65,24 +65,44 @@ s.charCodeAt(0) // 55362
65
65
s .charCodeAt (1 ) // 57271
66
66
```
67
67
68
- 上面代码中,汉字“𠮷”的码点是0x20BB7 ,UTF-16编码为0xD842 0xDFB7(十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且charAt方法无法读取字符,charCodeAt方法只能分别返回前两个字节和后两个字节的值 。
68
+ 上面代码中,汉字“𠮷”的码点是 ` 0x20BB7 ` ,UTF-16编码为 ` 0xD842 0xDFB7` (十进制为55362 57271),需要4个字节储存。对于这种4个字节的字符,JavaScript不能正确处理,字符串长度会误判为2,而且 ` charAt ` 方法无法读取整个字符, ` charCodeAt ` 方法只能分别返回前两个字节和后两个字节的值 。
69
69
70
- ES6提供了codePointAt方法 ,能够正确处理4个字节储存的字符,返回一个字符的码点。
70
+ ES6提供了 ` codePointAt ` 方法 ,能够正确处理4个字节储存的字符,返回一个字符的码点。
71
71
72
72
``` javascript
73
- var s = " 𠮷a " ;
73
+ var s = ' 𠮷a ' ;
74
74
75
75
s .codePointAt (0 ) // 134071
76
76
s .codePointAt (1 ) // 57271
77
77
78
78
s .charCodeAt (2 ) // 97
79
79
```
80
80
81
- codePointAt方法的参数 ,是字符在字符串中的位置(从0开始)。上面代码中,JavaScript将“𠮷a”视为三个字符,codePointAt方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制码点134071(即十六进制的20BB7 )。在第二个字符(即“𠮷”的后两个字节)和第三个字符“a”上,codePointAt方法的结果与charCodeAt方法相同 。
81
+ ` codePointAt ` 方法的参数 ,是字符在字符串中的位置(从0开始)。上面代码中,JavaScript将“𠮷a”视为三个字符,codePointAt方法在第一个字符上,正确地识别了“𠮷”,返回了它的十进制码点134071(即十六进制的 ` 20BB7 ` )。在第二个字符(即“𠮷”的后两个字节)和第三个字符“a”上,` codePointAt ` 方法的结果与 ` charCodeAt ` 方法相同 。
82
82
83
- 总之,codePointAt方法会正确返回四字节的UTF -16字符的码点。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt方法相同 。
83
+ 总之,` codePointAt ` 方法会正确返回32位的UTF -16字符的码点。对于那些两个字节储存的常规字符,它的返回结果与 ` charCodeAt ` 方法相同 。
84
84
85
- codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。
85
+ ` codePointAt ` 方法返回的是码点的十进制值,如果想要十六进制的值,可以使用` toString ` 方法转换一下。
86
+
87
+ ``` javascript
88
+ var s = ' 𠮷a' ;
89
+
90
+ s .codePointAt (0 ).toString (16 ) // "20bb7"
91
+ s .charCodeAt (2 ).toString (16 ) // "61"
92
+ ```
93
+
94
+ 你可能注意到了,` codePointAt ` 方法的参数,仍然是不正确的。比如,上面代码中,字符` a ` 在字符串` s ` 的正确位置序号应该是1,但是必须向` charCodeAt ` 方法传入2。解决这个问题的一个办法是使用` for...of ` 循环,因为它会正确识别32位的UTF-16字符。
95
+
96
+ ``` javascript
97
+ var s = ' 𠮷a' ;
98
+ for (let ch of s) {
99
+ console .log (ch .codePointAt (0 ).toString (16 ));
100
+ }
101
+ // "20bb7"
102
+ // ""
103
+ ```
104
+
105
+ ` codePointAt ` 方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。
86
106
87
107
``` javascript
88
108
function is32Bit (c ) {
@@ -95,7 +115,7 @@ is32Bit("a") // false
95
115
96
116
## String.fromCodePoint()
97
117
98
- ES5提供` String.fromCharCode ` 方法,用于从码点返回对应字符,但是这个方法不能识别辅助平面的字符(编号大于 ` 0xFFFF ` )。
118
+ ES5提供` String.fromCharCode ` 方法,用于从码点返回对应字符,但是这个方法不能识别32位的UTF-16字符(Unicode编号大于 ` 0xFFFF ` )。
99
119
100
120
``` javascript
101
121
String .fromCharCode (0x20BB7 )
@@ -109,9 +129,13 @@ ES6提供了`String.fromCodePoint`方法,可以识别`0xFFFF`的字符,弥
109
129
``` javascript
110
130
String .fromCodePoint (0x20BB7 )
111
131
// "𠮷"
132
+ String .fromCodePoint (0x78 , 0x1f680 , 0x79 ) === ' x\uD83D\uDE80 y'
133
+ // true
112
134
```
113
135
114
- 注意,` fromCodePoint ` 方法定义在String对象上,而` codePointAt ` 方法定义在字符串的实例对象上。
136
+ 上面代码中,如果` String.fromCharCode ` 方法有多个参数,则它们会被合并成一个字符串返回。
137
+
138
+ 注意,` fromCodePoint ` 方法定义在` String ` 对象上,而` codePointAt ` 方法定义在字符串的实例对象上。
115
139
116
140
## 字符串的遍历器接口
117
141
@@ -165,7 +189,7 @@ ES7提供了字符串实例的`at`方法,可以识别Unicode编号大于`0xFFF
165
189
166
190
## normalize()
167
191
168
- 为了表示语调和重音符号,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如Ǒ (\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如` O ` (\u004F)和` ˇ ` (\u030C)合成` Ǒ ` (\u004F\u030C)。
192
+ 为了表示语调和重音符号,Unicode提供了两种方法。一种是直接提供带重音符号的字符,比如 ` Ǒ ` (\u01D1)。另一种是提供合成符号(combining character),即原字符与重音符号的合成,两个字符合成一个字符,比如` O ` (\u004F)和` ˇ ` (\u030C)合成` Ǒ ` (\u004F\u030C)。
169
193
170
194
这两种表示方法,在视觉和语义上都等价,但是JavaScript不能识别。
171
195
@@ -178,32 +202,32 @@ ES7提供了字符串实例的`at`方法,可以识别Unicode编号大于`0xFFF
178
202
179
203
上面代码表示,JavaScript将合成字符视为两个字符,导致两种表示方法不相等。
180
204
181
- ES6提供 ` String.prototype. normalize()` 方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。
205
+ ES6提供字符串实例的 ` normalize() ` 方法,用来将字符的不同表示方法统一为同样的形式,这称为Unicode正规化。
182
206
183
207
``` javascript
184
208
' \u01D1 ' .normalize () === ' \u004F\u030C ' .normalize ()
185
209
// true
186
210
```
187
211
188
- normalize方法可以接受四个参数 。
212
+ ` normalize ` 方法可以接受四个参数 。
189
213
190
- - NFC,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。
191
- - NFD,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。
192
- - NFKC,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。
193
- - NFKD,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
214
+ - ` NFC ` ,默认参数,表示“标准等价合成”(Normalization Form Canonical Composition),返回多个简单字符的合成字符。所谓“标准等价”指的是视觉和语义上的等价。
215
+ - ` NFD ` ,表示“标准等价分解”(Normalization Form Canonical Decomposition),即在标准等价的前提下,返回合成字符分解的多个简单字符。
216
+ - ` NFKC ` ,表示“兼容等价合成”(Normalization Form Compatibility Composition),返回合成字符。所谓“兼容等价”指的是语义上存在等价,但视觉上不等价,比如“囍”和“喜喜”。(这只是用来举例, ` normalize ` 方法不能识别中文。)
217
+ - ` NFKD ` ,表示“兼容等价分解”(Normalization Form Compatibility Decomposition),即在兼容等价的前提下,返回合成字符分解的多个简单字符。
194
218
195
219
``` javascript
196
220
' \u004F\u030C ' .normalize (' NFC' ).length // 1
197
221
' \u004F\u030C ' .normalize (' NFD' ).length // 2
198
222
```
199
223
200
- 上面代码表示,NFC参数返回字符的合成形式,NFD参数返回字符的分解形式 。
224
+ 上面代码表示,` NFC ` 参数返回字符的合成形式, ` NFD ` 参数返回字符的分解形式 。
201
225
202
- 不过,normalize方法目前不能识别三个或三个以上字符的合成 。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。
226
+ 不过,` normalize ` 方法目前不能识别三个或三个以上字符的合成 。这种情况下,还是只能使用正则表达式,通过Unicode编号区间判断。
203
227
204
228
## includes(), startsWith(), endsWith()
205
229
206
- 传统上,JavaScript只有indexOf方法 ,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
230
+ 传统上,JavaScript只有 ` indexOf ` 方法 ,可以用来确定一个字符串是否包含在另一个字符串中。ES6又提供了三种新方法。
207
231
208
232
- ** includes()** :返回布尔值,表示是否找到了参数字符串。
209
233
- ** startsWith()** :返回布尔值,表示参数字符串是否在源字符串的头部。
@@ -227,11 +251,11 @@ s.endsWith('Hello', 5) // true
227
251
s .includes (' Hello' , 6 ) // false
228
252
```
229
253
230
- 上面代码表示,使用第二个参数n时,endsWith的行为与其他两个方法有所不同。它针对前n个字符,而其他两个方法针对从第n个位置直到字符串结束 。
254
+ 上面代码表示,使用第二个参数 ` n ` 时, ` endsWith ` 的行为与其他两个方法有所不同。它针对前 ` n ` 个字符,而其他两个方法针对从第 ` n ` 个位置直到字符串结束 。
231
255
232
256
## repeat()
233
257
234
- ` repeat ` 方法返回一个新字符串,表示将原字符串重复n次 。
258
+ ` repeat ` 方法返回一个新字符串,表示将原字符串重复 ` n ` 次 。
235
259
236
260
``` javascript
237
261
' x' .repeat (3 ) // "xxx"
0 commit comments