概述
ES6入门(阮一峰)字符串的新增方法
- 一、原生String对象的方法 即 String.xxx()
- String.fromCodePoint()
- String.raw()
- 二、实例方法
- codePointAt()
- normalize()
- includes()、startWith()、endsWith()
- repeat()
- padStart()、padEnd()
- trimStart()、trimEnd()
- matchAll()
- replaceAll()
- 总结
一、原生String对象的方法 即 String.xxx()
String.fromCodePoint()
用于从 Unicode 码点返回对应字符,并且可以识别码点大于0xFFFF的字符,弥补了 String.fromCharCode() 的不能识别码点大于0xFFFF的字符的缺陷。
String.fromCharCode(0x20BB7)
// "ஷ" // 最高位2被舍弃
String.fromCodePoint(0x20BB7)
// "????"
String.fromCodePoint(0x78, 0x1f680, 0x79) === 'xuD83DuDE80y'
// true 如果有多个参数,则它们会合并成一个字符串进行返回
String.raw()
该方法用于返回一个斜杠都被转义的字符串,往往用来模板字符串的处理
String.raw`Hin${2+3}!`
// 实际返回 "Hi\n5!",显示的是转义后的结果 "Hin5!"
String.raw`Hiu000A!`;
// 实际返回 "Hi\u000A!",显示的是转义后的结果 "Hiu000A!"
如果斜杠已经转义,则会再次转义
String.raw() 方法可以作为处理模板字符串的基本方法,它会将所有变量替换,而且对斜杠进行转义,方便下一步作为字符串来使用
String.raw() 本质上是一个正常的函数,只是专用于模板字符串的标签函数。如果写成正常函数的形式,它的第一个参数,应该是一个具有raw属性的对象,且raw属性的值应该是一个数组,对应模板字符串解析后的值
// `foo${1 + 2}bar`
// 等同于
String.raw({ raw: ['foo', 'bar'] }, 1 + 2) // "foo3bar"?
String.raw() 的代码实现
String.raw = function (strings, ...values) {
let output = '';
let index;
for (index = 0; index < values.length; index++) {
output += strings.raw[index] + values[index];
// 上面的问号 可以看看这里就瞬间理解惹
}
output += strings.raw[index]
return output;}
二、实例方法
codePointAt()
js内部,字符以UTF-16的格式存储,每个字符固定2个字节。对于那些需要4个字节存储的字符,js会认为它们是两个字符
于是就会出现这种情况
var s = "????"; //该字符由4个字节组成
s.length // 2 js判定该字符为两个字符
s.charAt(0) // ''
s.charAt(1) // ''
s.charCodeAt(0) // 55362
s.charCodeAt(1) // 57271
为了解决无法识别需要 4 个字节存储的字符,ES6推出了 codePointAt()
该方法能够正确处理 4 个字节的存储字符,返回一个字符的码点。
let s = '????a';
s.codePointAt(0) // 134071 20BB7的十进制 即????字符的码点
s.codePointAt(1) // 57271 但这个码点依旧是混乱的
s.codePointAt(2) // 97 a
注意虽然 codePointAt() 已经可以正确读出四个字节的存储字符的码点,但仍然存在下标不匹配的问题。
由两种方式解决这个问题
1.使用 for…of 循环,因为它会正确识别 32 位的 UTF-16 字符
2.使用扩展运算符(…)
codePointAt()方法是测试一个字符由两个字节还是由四个字节组成的最简单方法。
normalize()
许多欧洲语言你有语调符号和重音符号,为了表示它们,Unicode提供了两种方法。
1.直接提供带重音符号的字符
2.提供合成符号 即原字符与重音符号的合成,两个字符合成一个字符
这两种表示方法,在视觉和语义上都等价,但是js不能识别 js将合成字符视为两个字符
ES6提供字符串的normalize()方法,用来将字符的不同表示方法统一位同样的i形式,这称为 Unicode 正规化
includes()、startWith()、endsWith()
传统上,js只有 indexOf 方法,可以用来确定一个字符串是否包含在另一个字符串重。ES6又提供了三种新方法
1.includes() 返回布尔值,表示是否找到了参数字符串
2.startsWith() 返回布尔值,表示参数字符串是否在原字符串的头部
3.endsWith() 返回布尔值,表示参数字符串是否在原字符串的尾部
这三个方法都支持第二个参数,表示开始搜索的位置
repeat()
repeat方法返回一个新字符串,表示将原字符串重复n次
参数如果小数会取整,如果时字符串,则会优先转换数字,如果是NaN 等同于0
如果是小于-1的负数或者Infinity会报错
padStart()、padEnd()
ES2017 引入了字符串补全长度的功能,如果某个字符串不够指定长度,会在头部或者尾部补全
前者用于在头部补全,后者用于尾部。
trimStart()、trimEnd()
ES2019 对字符串实例新增了 trimStart() 和 trimEnd() 这两个方法。它们的行为和 trim() 一致
trimStart() 消除头部的空格
trimeEnd() 消除尾部的空格
除了空格键,这两个方法对字符串头部(或者尾部)的 tab键、换行符等不可见的空白符号也有效
浏览器还部署了额外的两个方法,trimLeft() 是trimStart() 的别名,同理 trimRight()
matchAll()
matchAll() 返回一个正则表达式在当前字符串的所有匹配
replaceAll()
历史上,字符串的实例方法 replace() 只能替换第一个匹配
如果要替换所有的匹配,则不得不使用正则表达式的 g 修饰符
ES2021 引入了 replaceAll() 方法,可以一次性替换所有匹配,用法与replace()一样,会返回新字符串,不会修改原字符串
总结
本文总结了ES6在字符串上扩展的方法,有码点的转换、字符的表示规格化、包含、重复、填充、去空格、匹配所有替换所有等等。
最后
以上就是危机牛排为你收集整理的ES6入门 (四)String方法的扩展一、原生String对象的方法 即 String.xxx()二、实例方法总结的全部内容,希望文章能够帮你解决ES6入门 (四)String方法的扩展一、原生String对象的方法 即 String.xxx()二、实例方法总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复