我是靠谱客的博主 危机牛排,最近开发中收集的这篇文章主要介绍ES6入门 (四)String方法的扩展一、原生String对象的方法 即 String.xxx()二、实例方法总结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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()二、实例方法总结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部