1、字符的 Unicode 表示法
- ES6 能够应用 \uxxxx 模式示意一个字符,其中 xxxx 示意字符的 Unicode 码点
// 这种表示法仅限于码点在 \u0000 ~ \uFFFF 之间的字符,超出的字符,必须应用两个双字节的模式示意
"\u0061" // => a
// 如果 \u 前面跟着超出的 0xFFFF 的数值,比方 \u20BB7,那么 JavaScript 会了解为 \u20BB+7。// 因为 \u20BB 不是一个不可打印字符,所以只会显示一个空格前面跟着一个 7
// ES6 的改良,只有将码点放入大括号中,就能正确解读该字符串
"\u{20BB7}" // "????"
"\u{41}u{42}u{43}" // "ABC"
let hello = 123
hell\u{6F} // => 123
'u{1F680}' === 'uD83DuDE80' // => true
// 有了这种示意办法之后,JavaScript 共有 6 种形式能够示意一个字符
'\z' === 'z' // true
'\172' === 'z' // true
'\x7A' === 'z' // true
'\u007A' === 'z' // true
'\u{7A}' === 'z' // true
2、字符串的遍历接口
- ES6 为字符串增加了遍历器接口,使得字符串能够被 for…of 循环遍历
- 能够辨认打野 0xFFFF 的码点,传统的 for 循环无奈辨认这样的码点
let text = String.fromCodePoint(0x20BB7);
for(let i=0; i<text.length; i++){console.log(text[i]);
}
// " "
// " "
for(let i of text) {console.log(i)
}
// "????"
3、间接输出 U +2028 和 U +2029
- 字符串中能够间接输出字符或者字符的本义模式
"中" === '\u4e2d' // "中" 的本义模式是 \u4e2d
-
然而 JavaScript 规定 5 个字符,不能在字符串外面间接应用,只能应用本义模式
- U+005c:反斜杠
- U+000D:回车
- U+2028:行分隔符
- U+2029:段分隔符
- U+000A:换行符
举例来说就是字符串外面不能够间接蕴含反斜杠,肯定要本义写成 \ 或者 \u005c
- 问题在于 JSON 格局容许字符串外面间接应用 U +2028(行分隔符)和 U +2029(段分隔符)。所以 ES2019 容许 JavaScript 字符串间接输出 U +2028 和 u +2029
- 模板字符串当初就容许间接输出这两个字符
- 正则表达式仍然不容许间接输出这两个字符
4、JSON.stringify()革新
- ES2019 扭转了
JSON.stringify()
的行为。如果遇到0xD800
到0xDFFF
之间的单个码点,或者不存在的配对模式,它会返回本义字符串,留给利用本人决定下一步的解决
JSON.stringify('u{D834}') // ""\uD834""
JSON.stringify('uDF06uD834') // ""\\udf06\\ud834""
5、模板字符串
- 反引号
- 可嵌套
- ${}嵌入变量
6、标签模板
- 标签模板性能:模板字符串能够紧跟一个函数名前面,该函数将被调用来解决这个模板字符串
- 标签模板其实不是模板,而是函数调用的一种模式。”标签“指的是函数,紧跟前面的模板字符串就是他的参数
alert`hello`
// 等同于
alert("hello")
- 如果模板字符串外面有变量,会将模板字符串先解决成多个参数,再调用函数
let a = 3;
let b = 4;
f`Hello ${a+b} world ${a*b}`; // 拆分为了”Hello "" world" 7 12
f(['Hello', 'world'], 7, 12); // 变量替换只产生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推
- “标签模板”的一个重要利用,就是过滤 HTML 字符串,避免用户输出歹意内容
- 多语言转换(国际化解决)
- 在 JavaScript 语言之中嵌入其余语言