您当前的位置:首页 > 计算机 > 编程开发 > JavaScript

ES6中几个比较实用的处理字符串方法

时间:03-30来源:作者:点击数:
  1.  
String.raw()

转义字符串中的斜杠,在每个斜杠之前再加一个斜杠

console.log(String.raw`Hi\n${2+3}!`);

实际返回 “Hi\n5!”,显示的是转义后的结果 “Hi\n5!”,如果不使用该方法的话在控制台上会显示这样:

Hi

5!

原因是其中的**\n**未转义,在输出的过程中,被识别为了换行符,但是经过该方法将斜杠转义之后,就可以打印出来。

console.log(String.raw`Hi\\n`);

实际返回 “Hi\\n”,显示Hi\n,即如果字符串中有多个斜杠,那么每个斜杠都会进行一次转义。

2.

codePointAt()

JS内部,字符以UTF-16的格式储存,每个字符串为2个字节,对于需要4个字符串储存的字符,JS会认为是两个字符,codePointAt()方法,能够正确处理 4 个字节储存的字符,返回一个字符的码点。

传统的charAt()是无法识别四个字节的字符,举个例子,"𠮷"的码点0x20BB7,UTF-16编码是0xD842 0xDFB7,十进制是55362 :

var s = "𠮷";
console.log(s.length);//2
console.log(s.charAt());//�
console.log(s.charAt(0));//�
console.log(s.charAt(1));//�

后面的在webstorm控制台上的输出结果,但实际上,由于charAt()无法读取到整个字符,输出应该为空。下面试试新方法:

console.log(s.charCodeAt(0));//55362
console.log(s.charCodeAt(1));//57271

该方法将"𠮷"分解为了两个2字节的字符,然后根据序号分别将其返回码点。

3.

codePointAt()

与charCodeAt()方法显示,可以处理4个字节储存的字符,正确返回 32 位的 UTF-16 字符的码点。对于那些两个字节储存的常规字符,它的返回结果与charCodeAt()方法相同,看一个例子:

let s = '𠮷a';
console.log(s.charCodeAt(0));//55362
console.log(s.codePointAt(0));//134071识别到了𠮷
console.log(s.charCodeAt(1));//57271
console.log(s.codePointAt(1));//57271识别到了𠮷中后两个字节,
console.log(s.charCodeAt(2));//97
console.log(s.codePointAt(2));//97识别到了字符a,与charCodeAt相似
console.log(s.codePointAt(0).toString(16));//对于 𠮷 16进制码点20bb7

可以看到该方法将字符串“𠮷a“分解为了三部分,第一部分是“𠮷”,第二部分是“𠮷”后面两个字节组成的字符,第三部分是“a”,但是为什么会出现这么诡异的分割呢,推测猜想可能是这样的,由于codePointAt()方法可以识别两个字节的字符,也可以识别四个的字符,但是它本身是并不知道该字符是两个字节还是四个字节,那么为了避免遗漏,只好从头开始遍历,每次只遍历两个字节的字符。

  1.  
normalize()

将字符的不同表示方法统一为同样的形式,这称为 Unicode 正规化

在JS中,JS中原字符串码点与组成子字符串之和并不相等,因为JS会把四个字节的字符识别为两个2字节的字符,举个例子:

console.log('\u01D1'==='\u004F\u030C' );//false
console.log('\u01D1');//Ǒ
console.log('\u004F\u030C');//Ǒ

但是这两个的码点对应的字符一样的。使用该方法可以将其标准化,使其相等:

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

另外该方法自带四个参数:

NFC:标准化合成,返回多个字符串的合成字符,视觉和语义上的等价。

console.log(`\u004F\u030C`.normalize('NFC').length);//1 
console.log(`\u004F\u030C`.normalize('NFC'));//Ǒ \u01D1

NFD:标准化分解,返回合成字符的多个字符串,视觉和语义上的等价。

console.log('\u01D1'.normalize('NFD').length);//2 
console.log('\u01D1'.normalize('NFD'));//Ǒ \u004F\u030C

NFKC:语义上的合成

NFKD:语义上的分解

5.

includes() 
startsWith()
endsWith()

includes() 判断目标子字符串是否在原字符串中,是返回true,否则返回false

startsWith()判断目标子字符串是否在原字符串首部中,是从原字符串的第一个字符开始匹配

endsWith()判断目标子字符串是否在原字符串尾部中,是从原字符串的最后一个字符开始匹配

该类方法还支持从原字符串开始查找的序号输入,使得startsWith()

endsWith()不再拘泥于首部和尾部开始匹配,值得注意的是,endsWith()方法的查找序号不能在目标子字符串中的序号组中

let s = 'Hello, world!';
console.log(s.startsWith('Hello'));//true 字符串是否在原字符串头部
console.log(s.startsWith('He'));
console.log(s.startsWith('e'));//false
console.log(s.startsWith('Hello', 0));//支持查找开始的序号
console.log(s.startsWith('Hello', 1));//false
console.log(s.endsWith('!'));//true 参数字符串是否在原字符串尾部
console.log(s.endsWith('Hello', 5));//true 注意是从字符串后的序号开始
console.log(s.includes('o'));//参数字符串时候在原字符串中
console.log(s.includes('Hello', 0));//与startsWith相似
  1.  
repeat()

将目标字符串重复n次,n是传入的参数,合成新的字符串并打印

console.log('s'.repeat(3));//sss 重复三次
console.log('o'.repeat(0));//""

该方法还可以进行参数四舍五入,如果是输入的字符,还可以将其转化为数字。

console.log('na'.repeat(2.9));//nanana
console.log('na'.repeat(2.1));//四舍五入nana
console.log('na'.repeat("2"));//进行字符串处理

如果n是负数的话,是会报错的:

console.log('na'.repeat(Infinity));//无穷报错
 console.log('na'.repeat(-1));//负数报错

但是如果是**-1~0** 之间的负数,那么就会遵守四舍五入原则,视为0

console.log('na'.repeat(-0.9));//取整为0
console.log('na'.repeat(NaN));//视为0
  1.  
padStart()
padEnd()

根据输入的指定长度,以替补字符串弥补,padStart()是在首部弥补,padEnd()是在尾部弥补

console.log('x'.padStart(5, "ad"));//adadx 头部进行补全,ad作为补全字符,x作为原字符

一般会有这几种情况,以padStart()为例:

指定长度小于等于原字符串长度,会返回原字符串

console.log('abcdefg'.padStart(5, "a"));//abcdefg

指定长度大于原字符串+替补字符串:

console.log('x'.padStart(5, "ad"));//adadx 头部进行补全,ad作为补全字符,x作为原字符

指定长度大于原字符串长度,小于原字符串+弥补字符串长度:

console.log('x'.padStart(3,"abcdef"));//abx

弥补字符串是空:

console.log('abc'.padStart(10));//       abc,空格补全
  1.  
trim()
trimStart()
trimEnd()

trimStart()消除字符串首部空格,trimEnd()消除字符串尾部空格,trim()消除字符串首部和尾部空格

const s = '  abc  ';
console.log(s.trim());//abc 去除空格
console.log(s.trimStart());//"abc  "去除头部空格
console.log(s.trimLeft());//"abc  "去除头部空格
console.log(s.trimEnd());//"  abc"去除尾部空格
console.log(s.trimRight());//"  abc"去除尾部空格
console.log(s.trim('a'));//abc 只能用于去除空格,传参无用但不报错

需要注意的是trim()只是消除的字符串从头部和尾部开始,相连的空格,并不能中间的空格。

const x = '  a bc  ';
console.log(s.trim());//a bc
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门