ES6学习笔记之字符串

Posted BennuCTech

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6学习笔记之字符串相关的知识,希望对你有一定的参考价值。

字符

javascript 共有 6 种方法可以表示一个字符。比如’z’

'\\z' 
'\\172' 
'\\x7A' 
'\\u007A'
'\\u7A' 

遍历

ES6 为字符串添加了遍历器接口,使得字符串可以被for…of循环遍历。

for (let codePoint of 'foo') 
  console.log(codePoint)

// "f"
// "o"
// "o"

模版字符串

ES6 引入了模板字符串,如下:

$('#result').append(`
  There are <b>$basket.count</b> items
   in your basket, <em>$basket.onSale</em>
  are on sale!
`);

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

// 普通字符串
`In JavaScript '\\n' is a line-feed.`

// 多行字符串
`In JavaScript this is
 not legal.`

// 字符串中嵌入变量
let name = "Bob", time = "today";
`Hello $name, how are you $time?`

如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。

let greeting = `\\`Yo\\` World!`;

如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。

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

上面代码中,所有模板字符串的空格和换行,都是被保留的。可以使用trim方法消除。如

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

$内部可以放入任意的 JavaScript 表达式,可以进行运算,以及引用对象属性。

let x = 1;
let y = 2;
`$x + $y = $x + y`
// "1 + 2 = 3"

let obj = x: 1, y: 2;
`$obj.x + obj.y`
// "3"

模板字符串之中还能调用函数。

function fn() 
  return "Hello World";

`foo $fn() bar`
// foo Hello World bar

如果大括号中的值不是字符串,会转为字符串。比如,默认调用对象的toString方法。

如果模板字符串中的变量没有声明,将报错。

由于模板字符串的大括号内部,就是执行 JavaScript 代码,因此如果大括号内部是一个字符串,将会原样输出。

模板字符串甚至还能嵌套。

const tmpl = addrs => `
  <table>
  $addrs.map(addr => `
    <tr><td>$addr.first</td></tr>
    <tr><td>$addr.last</td></tr>
  `).join('')
  </table>
`;

上面代码中,模板字符串的变量之中,又嵌入了另一个模板字符串,使用方法如下。

const data = [
     first: '<Jane>', last: 'Bond' ,
     first: 'Lars', last: '<Croft>' ,
];
console.log(tmpl(data));
// <table>
//
//   <tr><td><Jane></td></tr>
//   <tr><td>Bond</td></tr>
//
//   <tr><td>Lars</td></tr>
//   <tr><td><Croft></td></tr>
//
// </table>

标签字符串

模板字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串。这被称为“标签模板”功能(tagged template)。

alert`hello`
// 等同于
alert(['hello'])

如果模板字符里面有变量,就不是简单的调用了,而是会将模板字符串先处理成多个参数,再调用函数。

let a = 5;
let b = 10;
tag`Hello $ a + b  world $ a * b `;
// 等同于
tag(['Hello ', ' world ', ''], 15, 50);

第一个参数是一个数组,该数组的成员是模板字符串中那些没有变量替换的部分,也就是说,变量替换只发生在数组的第一个成员与第二个成员之间、第二个成员与第三个成员之间,以此类推。

“标签模板”的一个重要应用,就是过滤 HTML 字符串,防止用户输入恶意内容。

标签模板的另一个应用,就是多语言转换(国际化处理)。

新增方法

fromCodePoint

ES6 提供了String.fromCodePoint()方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode()方法的不足。

raw

该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。

codePointAt

ES6 提供了codePointAt()方法,能够正确处理 4 个字节储存的字符,返回一个字符的码点。

normalize

ES6 提供字符串实例的normalize()方法,用来将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化。

includes(), startsWith(), endsWith()

ES6新增了三种方法。注意它们都支持第二个参数,第二个参数表示开始搜索的位置。

repeat

返回一个新字符串,表示将原字符串重复n次。如果是小数则取整;如果是负数则报错,但是如果是(-1,0)之间的则视为0;如果是字符串则转成数字;如果是NaN等同于0;

padStart(),padEnd()

ES2017 引入了字符串补全长度的功能。如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

'x'.padStart(5, 'ab') // 'ababx'
'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'
'x'.padEnd(4, 'ab') // 'xaba'

如果省略第二个参数,默认使用空格补全长度。

padStart()的常见用途是为数值补全指定位数。下面代码生成 10 位的数值字符串。比如001、002、… 100

trimStart(),trimEnd()

ES2019 对字符串实例新增了trimStart()和trimEnd()这两个方法。它们的行为与trim()一致,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。

matchAll

matchAll()方法返回一个正则表达式在当前字符串的所有匹配。

以上是关于ES6学习笔记之字符串的主要内容,如果未能解决你的问题,请参考以下文章

ES6学习笔记之数值的扩展

ES6学习笔记之数值的扩展

ES6学习笔记之正则扩展

ES6学习笔记之正则扩展

我的es6学习笔记

ES6 从入门到精通系列学习笔记 23 篇(完结)