字符的Unicode表示法
- es6允许使用
\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点;但是折中表示只限于码点在\u0000~\uFFFF之间的字符,超出必须用两个双字节形式表示。
"\u0061" // a
"\u20BB7" // 7
// JS理解成"\u20BB"+7,"\u20BB"是不可打印字符,显示空格。
- 只要将码点放入大括号,JS就能正确解读该字符。
"\u{20BB7}"
// 𠮷
"\u{41}\u{42}\u{43}"
//ABC
字符串的遍历接口
- 字符串可以用
for...of遍历。
for(let i of 'foo'){
console.log(i)
}
// 'f'
// 'o'
// 'o'
for...of遍历器可以识别大于0xFFFF的码点,传统for循环无法识别。
let text = String.fromCodePoint(0x20BB7) // String.fromCodePoint()返回给定代码点序列创建的字符串
for (let i = 0; i < text.length; i++){
console.log(text[i])
}
// " "
// " "
for (let i of text){
console.log(i)
}
// "𠮷"
传统for循环会认为text包含两个字符(都不可打印),而for...of能识别出这一个字符。
- JS规定有5个字符不能在字符串里面直接使用,只能使用转义形式。
'\u005c' // \
'\u000D' // 回车
'\u2028' // 行分隔符
'\u2029' // 段分隔符
'\u000A' //换行符
- UTF-8标准规定,
0xD800到0xDFFF之间的码点不能单独使用,必须配对使用。比如,\uD834\uDF06是两个码点,但必须放在一起配对使用,表示字符𝌆。
但JSON.stringify()可能会返回0xD800到0xDFFF之间的单个码点;为保证返回合法UTF-8字符,ES2019改变JSON.stringify()的行为,当遇到0xD800到0xDFFF之间的码点,会返回转义字符串。
JSON.stringify('\u{D834}') // ""\\uD834""
JSON.stringify('\uDF06\uD834') // ""\\udf06\\ud834""
- 模板字符串用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
// 多行字符串
console.log(`string text line 1
string text line 2`)
// 字符串嵌入变量
let name = 'zs'
`Hello,${name}`
如果在字符串中要使用反引号,前面要用反斜杠转义。
let greeting = `\`Yo\``
如果用模板字符串表示多行字符串,所有空格和缩进会保留在输出之中;如果不想要换行,可以用trim消除。
$('#list').html(`
<ul>
<li>first</li>
</ul>
`);
// 消除换行
$('#list').html(`
<ul>
<li>first</li>
</ul>
`.trim())
嵌入变量的{}可以放任意的JS表达式,以及调用函数。
- “标签模板”功能:模板字符串可以紧跟在一个函数名后面,该函数会被调用来处理这个模板字符串(作为参数)。
alert `Hello`
// 等同于
alert(['Hello'])
如果模板字符里面有变量,函数会将模板字符串先处理成多个参数,再调用参数。
let a = 5
let b = 10
tag `Hello ${a+b} world ${a*b}`
// 等同于
tag(['Hello ',' world ', ''], 15, 50)
tag函数的第一个参数是一个数组,数组成员是模板字符串中没有变量替换的部分,变量替换只发生再数组第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。tag函数的其他参数是变量替换后的值。