字符串的扩展
字符的 Unicode 表示法
- 支持Unicode码表示一个字符:
\u0000
~\uFFFF
- 超出范围必须使用上述两个Unicode码表示
- 否则会理解成unicode字符码,加上后面的字符串的形式
- 对码点加上大括号,可解读所有字符:
\u{xxxx}
- JavaScript表示字符的六种方法,如下:
- '\z'
- '\172':八进制
- '\x7A':十六进制
- '\u007A'
- '\u{7A}'
字符串的遍历器接口
- 为字符串添加了遍历器接口,可以使用for……of遍历
- for……of可遍历大于0xFFFF的码点,for……in不可遍历此类码点
扩展:
- for……of和for……in的异同?
- for……of遍历可迭代对象:array、string、map、set、arguments(包括doms)、生成器、typedarray(
[0x00, 0xff]
)、其他可迭代对象,并返回每项的value - for……of可使用break、throw continue、return中止迭代
- for……in遍历一个对象的可枚举属性
- for……of遍历可迭代对象:array、string、map、set、arguments(包括doms)、生成器、typedarray(
直接输入 U+2028 和 U+2029
- JavaScript允许直接输入字符,以及他的Unicode码格式,两者是等价的
- 但反斜杠、回车、换行符、行(段)分隔符只能使用转义形式
- es2019允许字符串中输入行(段)分隔符,但正则表达式中不允许输入
JSON.stringify() 的改造
- json标准数据必须是utf-8编码
- 在
0xD800
~0xDFFF
之间的字符需要配对使用,且必须是配对已有的字符 - es2019之前,他会返回单个码点
\u{D834}
=>"\u{D834}"
- ES2019中,遇到该范围码点,且配对不合法,会直接返回转义字符
\u{D834}
=>"\\uD834"
模板字符串
- 使用反引号表示,可定义多行字符串、或在字符串中嵌入变量
- 定义多行字符串时,空格、缩进会原样保留
- 嵌入变量,应在反引号内部使用
${var}
的形式- var可以是变量,也可以是表达式(会自动执行,然后返回结果)
- var的值非普通字符串,会按照一般规则返回字符串形式
- var同样可以是一个模板字符串,可形成套娃形式(层层嵌套)
实例:模板编译
作用:将一个字符串模板编译成一个html模板(🔴没细看,感觉有点难)
javascript
// origin
let template = `
<ul>
<% for(let i=0; i < data.supplies.length; i++) { %>
<li><%= data.supplies[i] %></li>
<% } %>
</ul>
`;
// template html
<ul>
<li>broom</li>
<li>mop</li>
<li>cleaner</li>
</ul>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
标签模板(🟡)
公式如下:
javascript
func`Hello ${a} world ${b}`
=>=>=>=>=>=>=>=>=>=>=>=>=>
func(['hello ', ' world ', ''], `${a}`,`${b}`)
1
2
3
2
3
- 标签模板是函数调用的另一种方式,其中标签指的是函数,模板是函数的参数
- 函数与模板直接不能有空格
- 模板将常量字符串进行了分割,成为了函数参数第一个变量,后续变量依次为从左到右的变量字符串
- 作用:
- 通过参数传递到函数内部,将html模板进行过滤,防止恶意输入
- 进行多语言转换,在JavaScript语言中嵌入其他语言