String

在ES6之前字符串就已经拥有好几种帮助函数了,但是有更多的内容被加入了进来。

Unicode 函数

在第二章的“Unicode敏感的字符串操作”中详细讨论了String.fromCodePoint(..)String#codePointAt(..)String#normalize(..)。它们被用来改进JS字符串值对Unicode的支持。

  1. String.fromCodePoint( 0x1d49e ); // "?"
  2. "ab?d".codePointAt( 2 ).toString( 16 ); // "1d49e"

normalize(..)字符串原型方法用来进行Unicode规范化,它将字符与相邻的“组合标志”进行组合,或者将组合好的字符拆开。

一般来说,规范化不会对字符串的内容产生视觉上的影响,但是会改变字符串的内容,这可能会影响length属性报告的结果,以及用位置访问字符的行为:

  1. var s1 = "e\u0301";
  2. s1.length; // 2
  3. var s2 = s1.normalize();
  4. s2.length; // 1
  5. s2 === "\xE9"; // true

normalize(..)接受一个可选参数值,它用于指定使用的规范化形式。这个参数值必须是下面四个值中的一个:"NFC"(默认),"NFD""NFKC",或者"NFKD"

注意: 规范化形式和它们在字符串上的效果超出了我们要在这里讨论的范围。更多细节参见“Unicode规范化形式”(http://www.unicode.org/reports/tr15/)。

String.raw(..) 静态函数

String.raw(..)工具被作为一个内建的标签函数来与字符串字面模板(参见第二章)一起使用,取得不带有任何转译序列处理的未加工的字符串值。

这个函数几乎永远不会被手动调用,但是将与被标记的模板字面量一起使用:

  1. var str = "bc";
  2. String.raw`\ta${str}d\xE9`;
  3. // "\tabcd\xE9", not " abcdé"

在结果字符串中,\t是分离的未被加工过的字符,而不是一个转译字符序列\t。这对Unicode转译序列也是一样。

repeat(..) 原型函数

在Python和Ruby那样的语言中,你可以这样重复一个字符串:

  1. "foo" * 3; // "foofoofoo"

在JS中这不能工作,因为*乘法是仅对数字定义的,因此"foo"会被强制转换为NaN数字。

但是,ES6定义了一个字符串原型方法repeat(..)来完成这个任务:

  1. "foo".repeat( 3 ); // "foofoofoo"

字符串检验函数

作为对ES6以前的String#indexOf(..)String#lastIndexOf(..)的补充,增加了三个新的搜索/检验函数:startsWith(..)endsWith(..),和includes(..)

  1. var palindrome = "step on no pets";
  2. palindrome.startsWith( "step on" ); // true
  3. palindrome.startsWith( "on", 5 ); // true
  4. palindrome.endsWith( "no pets" ); // true
  5. palindrome.endsWith( "no", 10 ); // true
  6. palindrome.includes( "on" ); // true
  7. palindrome.includes( "on", 6 ); // false

对于所有这些字符串搜索/检验方法,如果你查询一个空字符串"",那么它将要么在字符串的开头被找到,要么就在字符串的末尾被找到。

警告: 这些方法默认不接受正则表达式作为检索字符串。关于关闭实施在第一个参数值上的isRegExp检查的信息,参见第七章的“正则表达式Symbol”。