01字符串新增方法(ES6)

141 阅读2分钟

字符串新增方法

1.String.fromChartCode()和String.fromCodePoint()

String.fromChartCode()用于从Unicode码点返回对应字符,但是这个方法不能识别码点大于0xFFFF的字符

String.fromCodePoint()用于从Unicode码点返回对应字符,但是这个方法能识别码点大于0xFFFF的字符

如果String.fromCodePoint方法有多个参数,则它们会被合并成一个字符返回

注意【fromCodePoint方法定义在String对象上,而codePointAt方法定义在字符串的实例对象上】

2.String.raw()

String.raw()该方法返回一个斜杠都被转义的字符串,一般用于模板字符串的处理方法

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

可以作为处理模板字符串的基本方法,它会将所有的变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用

本质上是一个正常的函数,只是专用于模板字符串的标签函数

如果写成正常函数,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组,对应模板字符串解析后的值

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

上面代码中,String.raw()方法的第一个参数是一个对象,它的raw属性等同于原始的模板字符串解析后得到的数组。

3.codePointAt()

codePointAt()能够正确处理4个字节存储的字符,返回一个字符的码点

codePointAt()方法的参数,是字符在字符串中的位置(从0开始)

codePointAt()方法返回的是码点的十进制,如果想要十六进制的值,可以使用toString()方法转换 s.codePointAt(2).toString(16) // "61"是不正确的

解决方法

使用for...of循环

let s = '𠮷a';

for (let ch of s) {

console.log(ch.codePointAt(0).toString(16));

}

// 20bb7

// 61

使用扩展运算符

let arr = [...'𠮷a']; // arr.length === 2

arr.forEach(

ch => console.log(ch.codePointAt(0).toString(16))

);

// 20bb7

// 61

codePointAt()可以测试一个字符由两个字节还是由四个字节组成的最简单方法

4.normalize()

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

normalize()方法可以接受一个参数来指定normalize的方式,参数的四个可选值分别是

NFC,默认参数,表示‘标准等价合成’,返回多个简单字符的合成字符串,‘标准等价’指的是视觉和语义上的等价

NFD,表示‘标准等价分解’,在标准等价的前提下,返回合成字符串分解的多个简单字符

NFKC,表示‘兼容等价合成’,返回合成字符,‘兼容等价’指的是语义上存在等价,但是视觉上不等价

NFKD,表示‘兼容等价分解’,即在兼容等价的前提下,返回合成字符串分解的多个简单字符

'\u004F\u030C'.normalize('NFC').length // 1

'\u004F\u030C'.normalize('NFD').length // 2

目前normalize方法不能识别三个或三个以上字符的合成,依然还是只能使用正则表达式,通过Unicode编码区间判断

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

indexOf()可以用来确定一个字符串是否包含在另一个字符串,es5

includes()返回布尔值,表示是否找到了参数字符串,es6

startsWith()返回布尔值,表示参数字符串是否在原字符串的头部,es6

endsWith()返回布尔值,表示参数字符串是否在原字符串的尾部,es6

let s = 'Hello world!';

s.startsWith('Hello') // true

s.endsWith('!') // true

s.includes('o') // true

includes(), startsWith(), endsWith()都支持第二个参数,表示开始搜索的位置

let s = 'Hello world!';

s.startsWith('world', 6) // true

s.endsWith('Hello', 5) // true

s.includes('Hello', 6) // false

使用第二个参数n时,endsWith的行为与其他两个方法有所不同,他是针对前n个字符,而其他两个方法针对从第n个位置知道字符串结束

6.repeat()

repeat()返回一个新字符串,表示将原字符串重复n次

参数如果是小数,会被取整

如果repeat的参数是负数或者Infinity,会报错,但是参数是0道-1之间的小数,则等同于0,这是因为会先进行取整运算

参数NaN等同于0

如果repeat的参数是字符串,则会先转换成数字

7.padSatrt()

padSatrt()如果某个字符串不够指定长度,会在头部补全

padEnd()如果某个字符串不够指定长度,会在尾部补全

可以接受两参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串

'x'.padStart(4, 'ab') // 'abax'
'x'.padEnd(5, 'ab') // 'xabab'

如果原字符串的长度等于或大于最大长度,则字符串补全不生效,返回原字符串

如果用来补全的字符串与原字符串,两者的长度之和超过了最大长度,则会截去超出位数的补全字符串

如果省略第二个参数,默认使用空格补全长度

padStart()常用于数值补全指定位数,或者提示字符串格式

8.trimStart()

trimStart()消除字符串头部的空格

trimEnd()消除尾部的空格

返回的是新字符串,不会修改原始字符串

除了空格键,对字符串头部或尾部的tab键,换行符等不可见的空白字符也是有效

浏览器还部署额外的两个方法trimLeft()是trimStart()的别名,trimRight()是trimEnd()的别名

9.matchAll()

matchAll()返回一个正则表达式在当前字符串的所有匹配

10.replace()

replace()只能替换第一个匹配

如果要替换所有的匹配,不得不使用正则表达式的g修饰符

'aabbcc'.replace(/b/g, '_') 
// 'aa__cc' replaceAll()可以一次性替换所有匹配 replaceAll()的第二个参数replacement是一个字符串,表示替换的文本,其中可以使用一些特殊字符串。
$&:匹配的字符串。
$:匹配结果前面的文本。 
$:匹配结果后面的文本。 
$n:匹配成功的第n组内容,n是从1开始的自然数。这个参数生效的前提是,第一个参数必须是正则表 
// $& 表示匹配的字符串,即b`本身 // 所以返回结果与原字符串一致 'abbc'.replaceAll('b', '$&')
// 'abbc'
// $` 表示匹配结果之前的字符串 
// 对于第一个`b`,$` 指代`a`
// 对于第二个`b`,$` 指代`ab` 'abbc'.replaceAll('b', '$`')
// 'aaabc' 
// $' 表示匹配结果之后的字符串 // 对于第一个`b`,$' 指代`bc` 
// 对于第二个`b`,$' 指代`c` 'abbc'.replaceAll('b', `$'`) 
// 'abccc' 
// $1 表示正则表达式的第一个组匹配,指代`ab` 
// $2 表示正则表达式的第二个组匹配,指代`bc` 'abbc'.replaceAll(/(ab)(bc)/g, '$2$1') 
// 'bcab' 
// $$ 指代 $ 'abc'.replaceAll('b', '$$') 
// 'a$c' 11.at()方法接受一个整数作为参数,返回参数指定位置的字符,支持负索引(即倒数的位置) 如果参数的位置超出字符串范围,at()返回undefined

【注】搬运工码字而已