一、字符串的Unicode表示法
表示方式:\uxxxx
范围:\u0000-\uFFFF
超出范围必须用双字节的方式来表示一个字符。
如:
"\uD842\uDFB7"
// "𠮷"
改进后的方法:用{}表示
"\u{20BB7}"
// "𠮷"
- 六种表示字符的方法:
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
二、字符串的遍历器接口
使用for of 循环遍历
for (let codePoint of 'foo') {
console.log(codePoint)
}
三、直接输入 U+2028 和 U+2029
U+005C:反斜杠(reverse solidus)
U+000D:回车(carriage return)
U+2028:行分隔符(line separator)
U+2029:段分隔符(paragraph separator)
U+000A:换行符(line feed)
alert("\u005C"+" 123");
alert("\u000D"+" 123");
alert("\u2028"+" 123");
alert("\u2029"+" 123");
alert("\u000A"+" 123");
四、JSON.stringify() 的改造
JSON 数据必须是 UTF-8 编码。但是现在的JSON.string方法有可能返回不符合UTF-8标准的字符串。
0xD800 ~ 0xDFFF之间的码点不能单独使用,需要把两个码点放到一起来表示一个字符。当JSON.stringify遇到0xD800~0xDFFF之间的单个码点或不配对时,会返回转义字符。
JSON.stringify('\u{D834}') // ""\\uD834""
JSON.stringify('\uDF06\uD834') // ""\\udf06\\ud834""
五、模板字符串
- 要输出(’)时,需用(\)转义
let greeting = `\`Yo\` World!`;
输出:
`Yo` World!
- 在使用(`)包括多行字符串时,所有的空格和缩进都被保留在输出之中。
alert(`
<ul>
<li>first</li>
<li>second</li>
</ul>
/*.trim()*/`);
输出:
空行
<ul>
<li>first</li>
<li>second</li>
</ul>
要想删去空行,需要使用.trim()方法
- 在字符串中嵌入变量,需加 ${}
var name = "lizhi";
alert(`my name is ${name}`); //my name is lizhi
- 模板字符串的${}内可放入Js表达式/函数(如fn())
- 如果模板字符串中的变量没有声明,将会报错。如果模板字符串内部包含的是字符串,将原样输出。
如:
//place未定义,报错
msg = `hello , ${place}`;
六、标签模板
(标签:指函数,紧跟在后的是它的参数)
功能:紧跟在一个函数名后面,该函数被调用来处理这个模板字符串。
alert`123 4`;
等价于
alert("123 1");
等价于
alert(['123 1']);
- 当有变量时,模板字符串会先处理不同字符串,在处理变量。
let a = 5; let b = 10;
tag`Hello ${a+b} world &{a*b}`
等价于
tag(["Hello ",' world ',''],15,50]);
此时tag接受三个参数,分别为数组,15,50
- 标签模板还可用于过滤字符串,防止用户恶意输入,原理是把特殊字符用同义的字符串代替,
如&----&
< ----<
- 标签模板还可用于国际语言转换
Welcome to ${siteName},you are visitor numer ${visitorNumber}
- console.log接受的参数是一个数组,该数组有一个raw属性,保存着原字符串。
- 模板字符串的限制
已知模板字符串课嵌入其他语言,但遇到\u0FF,\u{42}等字符时JS会将其当做Unicode字符转义,在以前的ES版本中会进行报错。但在ES2018中放松了对字符串转义的限制,但遇到不合法的字符串转义会返回undefined,而不是报错。