字符串的扩展和新增方法

字符串的扩展

  1. 字符的Unicode表示法
    ES6 允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。

但是,这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。

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

  2. 直接输入 U+2028 和 U+2029 **
    JavaScript 字符串允许直接输入字符,以及输入字符的转义形式

  1. JSON.stringify() 的改造
    JSON.stringify()的问题在于,它可能返回0xD800到0xDFFF之间的单个码点。

为了确保返回的是合法的 UTF-8 字符,ES2019 改变了JSON.stringify()的行为。如果遇到0xD800到0xDFFF之间的单个码点,或者不存在的配对形式,它会返回转义字符串,留给应用自己决定下一步的处理。

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

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

  1. 实例:模板编译

let template =

    <% for(let i=0; i < data.supplies.length; i++) { %>
  • <%= data.supplies[i] %>
  • <% } %>
;

上面代码在模板字符串之中,放置了一个常规模板。该模板使用<%...%>放置 JavaScript 代码,使用<%= ... %>输出 JavaScript 表达式。

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

8.模板字符串的限制
模板字符串默认会将字符串转义,导致无法嵌入其他语言。
例如在标签模板里面可以嵌入 LaTEX 语言。

字符块的限制.png

字符串的新增方法

1.String.fromCodePoint()
ES6 提供了String.fromCodePoint()方法,可以识别大于0xFFFF的字符,弥补了String.fromCharCode()方法的不足。在作用上,正好与下面的codePointAt()方法相反。

String.fromCodePoint(0x20BB7)
// ""
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'x\uD83D\uDE80y'
// true

  1. String.raw()
    ES6 还为原生的 String 对象,提供了一个raw()方法。该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。

String.rawHi\n${2+3}!
// 实际返回 "Hi\n5!",显示的是转义后的结果 "Hi\n5!"
String.rawHi\u000A!;
// 实际返回 "Hi\u000A!",显示的是转义后的结果 "Hi\u000A!"

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

let s = 'a';
s.codePointAt(0) // 134071
s.codePointAt(1) // 57271
s.codePointAt(2) // 97

codePointAt()方法的参数,是字符在字符串中的位置(从 0 开始)。上面代码中,JavaScript 将“a”视为三个字符,codePointAt 方法在第一个字符上,正确地识别了“”,返回了它的十进制码点 134071(即十六进制的20BB7)。在第二个字符(即“”的后两个字节)和第三个字符“a”上,codePointAt()方法的结果与charCodeAt()方法相同。

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

'\u01D1'.normalize() === '\u004F\u030C'.normalize()
// true

  1. 实例方法:includes(), startsWith(), endsWith()
  • includes():返回布尔值,表示是否找到了参数字符串。
  • startsWith():返回布尔值,表示参数字符串是否在原字符串的头部。
  • endsWith():返回布尔值,表示参数字符串是否在原字符串的尾部。
  1. 实例方法:repeat()
    repeat方法返回一个新字符串,表示将原字符串重复n次。

'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
'na'.repeat(0) // ""

  1. 实例方法: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'

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

const s = ' abc ';
s.trim() // "abc"
s.trimStart() // "abc "
s.trimEnd() // " abc"

你可能感兴趣的:(字符串的扩展和新增方法)