4.1 字符的unicode表示法
unicode表示法 | 码点 | 兼容性 |
---|---|---|
\uxxxx |
一个两个字节长度的16进制数字 | all |
\uxxxx\uxxxx |
两个两个字节长度的16进制数字 | all |
\u{xx...} |
码点为任意unicode编码 | es6+ |
1 | "\u{20BB7}" |
4.2 codePointAt()
背景:javascript
使用utf-16
(两个字节)存储字符,使用charCodeAt
无法正确处理四字节字符
类似charCodeAt
,区别是codePointAt
能够正确识别四字节字符(比如吉祥
)。
1 | var s = '吉a'; |
注意:codePointAt
仍会按照两个字节一个字符的方式计算字符串中字符数量,因此传递给codePointAt
的参数和charCodeAt
是一样的。
扩展:使用for-of
可以正确识别32位(4字节)UTF-16字符。
1 | var s = '吉a'; |
技巧:使用codePointAt
获取字符的UTF-16
完整编码,并判断其大小,就可以识别4字节字符。
1 | function is32Bit(c) { |
4.3 String.fromCodePoint()
背景:String.fromCharCode
用于从码点返回对应的字符,但对32位的UTF-16
字符进行转换会发生溢出。
String.fromCodePoint
对应codePointAt
,可以正确返回32为UTF-16
字符对应的字符;当传递多个参数给String.fromCodePoint
时,会返回每个参数(码点)对应的字符拼接成的字符串。
1 | String.fromCodePoint(0x20BB7) |
4.4 字符串的遍历器接口
说明:es6为字符串添加了便利器接口,因而可以通过for-of
遍历字符串。
特点:能够正确识别码点大于\uffff
的字符
技巧:利用for-of
计算字符串正确的字符个数(传统的for
和for-in
无法做到)
1 | var text = String.fromCodePoint(0x20BB7); |
4.5 at()
说明:字符串的方法(提案状态?),能够识别码点大于\uffff
的字符
ES5:字符串的charAt
方法用于返回字符串给定位置的字符,但不能正确识别码点大于\uffff
的字符
1 | '吉'.at(0) // "吉" |
4.6 normalize()
说明:es6提供字符串实例的normalize
方法,用来将字符的不同表示方法统一为同样的形式,称为unicode正规化
。
4.7 includes(), startsWith(), endsWith()
方法 | 返回值 | 第一个参数 | 第二个参数(可选) |
---|---|---|---|
includes | 布尔值,表示是否找到了参数字符串 | 要搜索的字串 | 开始搜索的位置 |
startsWith | 布尔值,表示参数字符串是否在源字符串的头部 | 要搜索的字串 | 开始搜索的位置 |
endsWith | 布尔值,表示参数字符串是否在源字符串的尾部 | 要搜索的字串 | 停止搜索的位置 |
1 | var s = 'Hello world!'; |
4.8 repeat()
用途:返回一个将源字符串重复n次的新字符串
注意:如果参数不是整数,将会按照一定规则取整
非整数参数 | 转换后 |
---|---|
小数 | 向下取整 |
负数或Infinity |
报错 |
0~-1 | 0 |
NaN |
0 |
字符串 | 相应的数字 |
1 | 'x'.repeat(3) // "xxx" |
4.9 padStart(), padEnd()
ES7:补全字符串的长度
函数 | 用途 |
---|---|
padStart | 用于头部补全 |
padEnd | 用于尾部补全 |
参数 | 说明 |
---|---|
第一个参数 | 指定字符串的最小长度 |
第二个参数(可选) | 用来补全的字符串,默认为空格。如果用来补全的字符串与原字符串,两者的长度之和超过了指定的最小长度,则会截去超出位数的补全字符串 |
注意:如果原字符串的长度,等于或大于指定的最小长度,则返回原字符串。
1 | // 为数值补全指定位数 |
4.10 模版字符串
语法:使用反引号括起来
- 可以当作普通字符串来使用,也可以用来定义多行字符串
- 可以在字符串中
嵌入变量
- 如果模版字符串中使用反引号,则前面要用
反斜杠转义
- 所有的
空格和缩进
都会被保留在输出之中,不需要的话可以使用trim
方法消除 - 模板字符串中嵌入变量,需要将变量名写在
${}
之中
4.10.1 嵌入JS表达式
大括号内部可以放入任意的JavaScript表达式,可以
- 进行运算
- 引用对象属性
- 调用函数
注意:
- 如果
${}
中的值不是字符串,将按照一般的规则转为字符串 - 如果
${}
内部是一个字符串,将会原样输出 - 如果模板字符串中的变量没有声明,将报错
- 通过
${}
,模板字符串甚至还能嵌套
1 | // 定义返回模版字符串的函数 |
4.11 实例:模版编译
l04_template.vue
1 | <script> |
1 | # http://localhost:8080/#!/l04 |
4.12 标签模版
说明:一种针对模版字符串的特殊函数调用。
语法:
1 | 函数名`模${表达式1}版字${表达式2}串`; |
参数:调用函数传入的第一个参数有一个row
属性,是一个和第一个参数本身内容相同的数组,不过元素中的所有\
都被转义了,从而可以获得字符串的原始版本。
用途:通过实现相应的处理模版字符串的函数,标签模版
常用于
- 处理
HTML
字符串过滤 - 多语言转换(国际化处理)
- 为模版增加条件判断和循环处理等模版基础能力
- 嵌入其它语言
l04_taggedTemplate.vue
1 | <script> |
4.13 String.raw()
用途:两种使用方式
- 作为模版标签使用
- 作为普通函数调用
1 | <script> |