本文目录:

  • 1.String.fromCodePoint()
  • 2.String.raw()
  • 3.实例方法:codePointAt()
  • 4.实例方法:includes()、startsWith()、endsWith()
  • 5.实例方法:repeat()
  • 6.实例方法:padStart()、padEnd()
  • 7.实例方法:trimStart()、trimEnd()


1.String.fromCodePoint()

ES5中使用String.fromCharCode()方法,用于从Unicode码点返回字符,但是这个方法不能识别大于0xFFFF的码点。

String.fromCharCode(0x20BB7);  //"ஷ"

上面的例子中String.fromCharCode()方法不能识别0x20BB7码点,发生了溢出,最高位2被舍弃,最后返回码点U+0BB7对应的字符,而不是码点U+20BB7对应的字符。

ES6提供了新的方法String.fromCodePoint(),用于完善String.fromCharCode()方法,String.fromCodePoint()方法可以识别大于0xFFFF的码点。

String.fromCodePoint(0x20BB7);  //"𠮷"

上面的例子中,String.fromCodePoint()方法可以识别0x20BB7码点。

比较String.fromCodePoint()方法的作用正好与CodePointAt()方法的作用相反,前者用于从Unicode码点返回字符,后者用于从字符返回Unicode码点。


2.String.raw()

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

String.raw`Hello \n World!`;  //"Hello \\n World!"

如果原字符串的斜杠已经被转义,那么String.raw()会进行再次转义。

String.raw`Hello \\ world!`;  //"Hello \\\\ world!"

String.raw()本质上是一个正常的函数,只是专用于模板字符串的标签函数。如果写成正常函数的形式,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组,对应模板字符串解析后的值。

// `foo${1 + 2}bar`
  // 等同于
  String.raw({ raw: ['foo', 'bar'] }, 1 + 2) // "foo3bar"


3.实例方法:codePointAt()

JavaScript 内部,字符以 UTF-16 的格式储存,每个字符固定为2个字节。对于那些需要4个字节储存的字符(Unicode 码点大于0xFFFF的字符),JavaScript 会认为它们是两个字符。

charCodeAt()方法用于从字符返回Unicode码点(十进制),无法处理码点大于u0FFFF的字符。

let str = "𠮷";
   
   str.length;  //2

   str.charCodeAt(0);  // 55362
   str.charCodeAt(1);  // 57271

注意:汉字“𠮷”的Unicode码点为0x20BB7 上面的例子中,由于汉字“𠮷”的Unicode码点大于0xFFFF,所以javascript会将它识别为两个字符,strlength值会被误判为2,charCodeAt()方法不能正确处理“𠮷”,只能分别返回它前两个字节的Unicode码点和后两个字节的Unicode码点。

注意: 码点大于u0FFFF的字符需要四个字节存储。

ES6提供了codePointAt()方法,它是定义在字符串的实例对象上,用于从字符串返回Unicode码点(十进制),它可以处理码点大于0xFFFF的字符(四个字节存储的字符)。

let str = "𠮷a";
   
   str.codePointAt(0); //134071
   str.codePointAt(1); //57271
   str.codePointAt(2); //97

上面的例子,javascript会将"𠮷a"视为三个字符(6个字节),codePointAt可以正确处理"𠮷"字,所以str.codePointAt(0)返回"𠮷"字的十进制码点134071,即十六进制的0x20BB7,codePointAt处理的第二个字符是“𠮷”字的后两个字节,所以str.codePointAt(1)会返回“𠮷”字后两个字节的十进制码点57271,第三个字符是"a",str.codePointAt(2)返回字符"a"的十进制码点97。

注意:
1.如果处理的字符的码点小于0xFFFF,charCodeAtcodePointAt返回结果相同。
2.虽然codePointAt可以识别码点大于0xFFFF的字符,但是javascript会把码点大于0xFFFF的字符看作两个字符,这就会导致codePointAt方法的参数错误。

let str = "𠮷a";
   str.codePointAt(0); //134071
   str.codePointAt(1); //57271
   str.codePointAt(2); //97

上面的例子中,字符"a"在codePointAt中对应的参数应该是1,但是codePointAt中的参数是2对应的字符才是“a”,处理这个问题,可是使用for…of,这是因为for…of可以识别码点大于0xFFFF的字符。

let str = "𠮷a";
   for(let i of str){
       console.log(i.codePointAt(0));
   }
   //134071
   //97


返回结果转换为16进制:
codePointAt方法与charCodeAt方法返回的码点都是十进制的,如果想转换为十六进制,可以使用toString方法。

let str = "𠮷";
  
  str.codePointAt(0);  //134071
  str.codePointAt(0).toString(16); //0x20BB7



实例: 使用codePointAt方法判断一个字符是由两个字节组成还是由四个字节组成

function test(str){
      return str.codePointAt(0)>0xFFFF;
  }//如果是由四个字节组成返回true,否则返回false
  let s1 = "𠮷";
  let s2 = "a";
  test(s1);  //true
  test(s2);  //false


4.实例方法:includes()、startsWith()、endsWith()

javascript中只有indexof方法可以判断一个字符串是否包含在另一个字符串中。

ES6又提供了三种方法,includes,startsWith,endsWith,来判断一个字符串是否包含在另一个字符串中。

includes返回布尔值,判断一个字符串是否包含参数字符串。
startsWith返回布尔值,判断参数字符串是否在原字符串的头部。
endsWith返回布尔值,判断参数字符串是否在原字符串的尾部。

let str = "abcdef";
   let str1 = "ab";
   let str2 = "ef";
   
   str.includes(str1);   //true
   str.startsWith(str1); //true
   str.endsWith(str2);   //true


5.实例方法:repeat()

ES6提供了repeat方法,返回一个新的字符串,表示重复几次原字符串。

let str = "hello";
  str.repeat(2); //"hellohello"
  str.repeat(3); //"hellohellohello"

如果参数是小数,将对小数取整。

let  str = "Hi";
  
  str.repeat(2.7);  //"HiHi"

如果参数是负数或者Infinity,将会报错。

let str = "Hi";
  str.repeat(-2);         // RangeError
  str.repeat(Infinity);   // RangeError



但是如果参数是-1到0之间的小数,则等同于0,因为会先做取整运算,-1~0之间的小数取整会得到0.

let str = "hello";
  str.repeat(-0.5);//""



如果参数是

NaN,也等同于0

如果参数是字符串,则会先转换为数值。



6.实例方法:padStart()、padEnd()

ES6提供了两个字符串补全方法
padStart方法用于头部补全。
padEnd方法用于尾部补全。

let str = "s";
  str.padStart(5,"ab"); //"ababs"
  str.padEnd(5,"ab");   //"sabab"
  
  'x'.padStart(4, 'ab') // 'abax'

padStartpadEnd方法接受两个参数,第一个参数是补全生效的长度,第二个参数是用于补全的字符串。

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

'x'.padStrart(5);//"    x"
  'x'.padEnd(5);   //"x    "


7.实例方法:trimStart()、trimEnd()

ES2019 提供了trimStart()trimEnd()两个方法,用于消除字符串中的空格。
trimStart()用于消除字符串开头的空格。
trimEnd()用于消除字符串结尾的空格。

let str1 = "  x";
  let str2 = "abc   ";
  
  str1.trimLeft();//"x"
  str2.trimRight();//"abc"

trimLefttrimRight分别是trimStarttrimEnd的别名。

除了空格键,这两个方法对字符串头部(或尾部)的 tab 键、换行符等不可见的空白符号也有效。