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

栏目: JavaScript · 发布时间: 5年前

内容简介:在 ES5 中,仅允许表示由此,JavaScript 共有6中表示字符的方式:除了遍历字符串,这个遍历器最大的优点是可以识别大于0xFFFF的码点,传统的for循环无法识别这样的码点。

字符的 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!"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Code Reading

Code Reading

Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99

This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具