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()方法可以识别两个字节的字符,也可以识别四个的字符,但是它本身是并不知道该字符是两个字节还是四个字节,那么为了避免遗漏,只好从头开始遍历,每次只遍历两个字节的字符。
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相似
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
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,空格补全
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