乐趣区

关于javascript:ES6语法总结字符串的扩展

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 个字符,不能在字符串外面间接应用,只能应用本义模式

    1. U+005c:反斜杠
    2. U+000D:回车
    3. U+2028:行分隔符
    4. U+2029:段分隔符
    5. U+000A:换行符

    举例来说就是字符串外面不能够间接蕴含反斜杠,肯定要本义写成 \ 或者 \u005c

  • 问题在于 JSON 格局容许字符串外面间接应用 U +2028(行分隔符)和 U +2029(段分隔符)。所以 ES2019 容许 JavaScript 字符串间接输出 U +2028 和 u +2029
  • 模板字符串当初就容许间接输出这两个字符
  • 正则表达式仍然不容许间接输出这两个字符

4、JSON.stringify()革新

  • ES2019 扭转了 JSON.stringify() 的行为。如果遇到 0xD8000xDFFF之间的单个码点,或者不存在的配对模式,它会返回本义字符串,留给利用本人决定下一步的解决
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 语言之中嵌入其余语言
退出移动版