ECMAScript 6 学习笔记(三):字符串扩展

字符的 Unicode 表示法

在 ES5 中,仅允许表示 \u0000 ~ \uFFFF 之间的字符,一旦超出这个范围就必须要用两个双字节的形式表示,而在 ES6 中,只需要把 Unicode 放入大括号中,就能正确解读。

"\uD842\uDFB7" // "𠮷"

"\u20BB7" // " 7",只能解析为 "\u20BB" 和 7

"\u{20BB7}" // "𠮷"

由此,JavaScript 共有6中表示字符的方式:

'\z'     // 'z'
'\172'   // 'z'
'\x7A'   // 'z'
'\u007A' // 'z'
'\u{7A}' // 'z'

字符串的遍历器

除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。

for (let char of 'hello') {
  console.log(char)
}

字符串搜索

  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。

这三个方法有两个参数,参数一表示需要匹配的字符串,参数二表示开始搜索的位置。

let s = 'Hello world!';

s.startsWith('Hello') // true
s.endsWith('!') // true
s.includes('o') // true

s.startsWith('world', 6) // true
s.endsWith('Hello', 5) // true
s.includes('Hello', 6) // false

字符串补充

  • repeat():将源字符串重复 n 次
  • padStart():头部补全
  • padEnd():尾部补全
'x'.repeat(3) // "xxx"
'x'.padStart(5, '0') // '0000x'
'x'.padEnd(5, '0') // 'x0000'

模板字符串

模板使用反引号,模板中的空格和缩进会被保留。

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`);

如果不需要保留,可以使用 trim() 方法。

$('#list').html(`
<ul>
  <li>first</li>
  <li>second</li>
</ul>
`.trim());

模板字符串中使用变量的方式如下所示,大括号内可以放入任意表达式,包括函数。如果大括号内的值非字符串比如对象,则会默认调用 toString() 方法。

function authorize(user, action) {
  if (!user.hasPrivilege(action)) {
    throw new Error(
      `User ${user.name} is not authorized to do ${action}.`);
  }
}

标签模板

标签模板其实不是模板,而是函数调用的一种特殊形式。“标签”指的就是函数,紧跟在后面的模板字符串就是它的参数。但是,如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。

let a = 5;
let b = 10;

function tag(stringArr, ...values){
  // ...
}

tag`Hello ${ a + b } world ${ a * b }`;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);

tag 函数的第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。“标签模板”的一个重要应用,就是过滤 HTML 字符串,防止用户输入恶意内容。

其他新增方法

codePointAt()

JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符),JavaScript 会认为它们是两个字符。

var s = "𠮷";

s.length // 2
s.charAt(0) // ''
s.charAt(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271

codePointAt方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。

String.fromCodePoint()

ES5 提供 String.fromCharCode 方法,用于从码点返回对应字符,但是这个方法不能识别 32 位的 UTF-16 字符(Unicode 编号大于 0xFFFF)。ES6 提供了 String.fromCodePoint 方法,可以识别大于 0xFFFF 的字符,正好与 codePointAt 方法相反。

String.fromCharCode(0x20BB7)  // "ஷ"
String.fromCodePoint(0x20BB7) // "𠮷"

String.raw()

该方法可以作为处理模板字符串的基本方法,它会将所有变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用。

String.raw`Hi\n${2+3}!`;
// 返回 "Hi\\n5!"
点赞

发表评论

电子邮件地址不会被公开。