前言
本章主要是内容为是 ES6 对字符串的改造和增强。
本章记录字符串的扩展常用重点部分,不常用知识稍作记录。
本章原文链接: 字符串的扩展
模板字符串(template string)
ES6字符串的扩展最常用的就是模版字符串了
模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
- 模版字符串 保留空格和换行。
- 模版字符串 是允许嵌入变量名或表达式。
- 模版字符串 可以嵌套模版字符串。
- 模版字符串 "标签模板"功能
模版字符串保留空格和换行,直接在模版字符串中使用换行与空格就行
// 模版字符串保留空格和换行
const SAMPLE =
`
- list1
- list2
- list3
- list4
`;
console.log(SAMPLE);
// 输出结果为
/*
- list1
- list2
- list3
- list4
*/
模版字符串使用变量与字符串需要写在${}
的大括号中,在大括号中也可以写字符串。
// 在模版字符串中使用变量与表达式
let sampleName = "gssg";
let sampleAge = 10;
let sampleAge1 = 8;
const SAMPLE = `My name is ${sampleName} and MY age is ${sampleAge + sampleAge1} years old`;
console.log(SAMPLE);
// 输出 My name is gssg and MY age is 18 years old
在模版字符串中还可以写模版字符串,利用${}
来嵌套。
// 模版字符串的嵌套
const SAMPLE = `
${`- list1
- list2
`}
`;
console.log(SAMPLE);
// 输出
/*
list1
list2
*/
模版字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。
标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。
alert`hello`;
// 等同于
alert(['hello']);
// 模板字符串前面有一个标识名tag,它是一个函数。整个表达式的返回值,就是tag函数处理模板字符串后的返回值。
let sample = 5;
let sample1 = 10;
tag`Hello ${sample} world ${sample + sample1}`;
// 等同于
tag(['Hello ', ' world ', ''], 5, 15);
Unicode
Unicode
的目标是为世界上每一个字符提供唯一标识符,唯一标识符称为码位或码点(code point)。而这些码位是用于表示字符的,又称为字符编码(character encode)
ES6 加强了对 Unicode
的支持,允许采用\uxxxx
形式表示一个字符,其中xxxx
表示字符的 Unicode
码点。
console.log("\u0062"); // b
// 也可以使用大括号将原来超过 0xFFFF 的数值,正确解读
console.log("\u{20FFF}"); //
字符串的遍历器接口
ES6 为字符串添加了遍历器接口(这部分内容在后面),使得字符串可以被for...of
循环遍历。
for (let item of 'sample') {
console.log(item);
}
// 逐个输出
/*
l
p
m
a
s
e
*/
这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。
let sample = "\u{20FFF}";
for (let item of sample) {
console.log(item);
}
// 输出
JSON.stringify() 的改造
根据标准,JSON
数据必须是 UTF-8
编码。但是,现在的JSON.stringify()
方法有可能返回不符合 UTF-8
标准的字符串。
ES2019 改变了JSON.stringify()
的行为。如果遇到0xD800
到0xDFFF
之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。
let sample = JSON.stringify('\u{D834}');
let sample1 = JSON.stringify('\uDF06\uD834');
console.log(sample, sample1); // "\ud834" "\udf06\ud834"