1. 字符的Unicode表示法

ES6加强了对Unicode的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的Unicode码点。但是这种表示法只限于码点在\u0000~\uFFFF之间的字符。超出这个范围的字符,必须用两个双字节的形式表示。

2.字符串的遍历器接口

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

  1. for (let codePoint of 'foo'){
  2. console.log(codePoint)
  3. }
  4. //"f"
  5. //"o"
  6. //"o"

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

4. JSON.stringify()的改造

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

  1. JSON.stringify('\u{D834}') //""\\uD834""
  2. JSON.stringify('\uDF06\uD834') //""\\udf06\\ud834""

5.模板字符串

  1. $('#reuslt').append(`
  2. There are <b>${basket.count}</b> items
  3. in your basket,<em>${basket.onSale}</em>
  4. are on sale!
  5. `);

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。模板字符串中嵌入变量需要将变量名写在${}里。大括号内部可以放入任意的JS表达式,可以进行运算,以及引用对象属性,可以调用函数。

  1. // 普通字符串
  2. `In JavaScript '\n' is a line-feed.`
  3. // 多行字符串
  4. `In JavaScript this is
  5. not legal.`
  6. console.log(`string text line 1
  7. string text line 2`);
  8. // 字符串中嵌入变量
  9. let name = "Bob", time = "today";
  10. `Hello ${name}, how are you ${time}?`

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

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

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

6.标签模板

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

  1. alert `123`
  2. //=
  3. alert(123)

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

  1. let message =
  2. SaferHTML1<p>${sender} has sent you a message.</p>`;
  3. function SaferHTML(templateData){
  4. les s = templateData[0];
  5. for(let i = 1;i<arguments.length;i++){
  6. let arg = String(arguments[i]);
  7. //Escape special characters in the substitution.
  8. s+=arg.replace(/&/g,"&amp;")
  9. .replace(/</g,"&lt;")
  10. .replace(/>/g,"&gt;");
  11. s+= templateData[i];
  12. }
  13. return s;
  14. }

7.字符串的新增方法

1. String.fromCodePoint()

ES5提供String.fromCharCode()方法,用于从Unicode码点返回对应字符,但是这个方法不能码点大于0xFFFF的字符。ES6提供了String.fromCodePoint()方法,可以识别0xFFFF的字符。

2.Strong.raw()

该方法返回一个斜杠都被转义(即斜杠前面再加一个斜杠)的字符串,往往用于模板字符串的处理方法。
如果原字符串的斜杠已经转义,那么String.raw()会再次转义。
String.raw()方法也可以作为正常的函数使用。这时,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组。

  1. String.raw({raw"'test'},0,1,2);
  2. //'t0e1s2t'
  3. //=
  4. String.raw({raw:['t','e','s','t']},0,1,2);

3.实例方法:codePointAt()

JavaScript内部,字符以UTF-16的格式储存,一般为2个字节。对4个字节的字符会认为是2个字符
codePointAt()能够正确处理4个字节储存的字符,返回一个字符的码点。

4.normalize()

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

5.includes(),startsWith(),endsWith()

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

    6.repeat()

    repeat()方法返回一个新字符串,表示将原字符串重复n次。如果参数是小数,会取整。如果参数是负数或者Infinity会报错。如果参数是0-1之间的小数,由于先取整,视同为0。参数NaN等同于0。

    7.padStart(),padEnd()

    padStart()用于头部补全,padEnd()用于尾部补全。
  1. 'x'.padStart(5,'ab') //'ababx'
  2. 'x'.padEnd(5,'ab') //'xabab'

8.trimStart(),strimEnd()

ES2019新增了这两个函数,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。