• ES6 入门教程 5 字符串的新增方法 5.7 实例方法:padStart(),padEnd() ~ 5.11 实例方法:at()


    ES6 入门教程

    ECMAScript 6 入门

    作者:阮一峰

    本文仅用于学习记录,不存在任何商业用途,如侵删

    5 字符串的新增方法

    5.7 实例方法:padStart(),padEnd()

    ES2017 引入了字符串补全长度的功能。

    如果某个字符串不够指定长度,会在头部或尾部补全。padStart()用于头部补全,padEnd()用于尾部补全。

    'x'.padStart(5, 'ab') // 'ababx'
    'x'.padStart(4, 'ab') // 'abax'
    
    'x'.padEnd(5, 'ab') // 'xabab'
    'x'.padEnd(4, 'ab') // 'xaba'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面代码中,padStart()padEnd()一共接受两个参数,第一个参数是字符串补全生效的最大长度,第二个参数是用来补全的字符串。

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

    'xxx'.padStart(2, 'ab') // 'xxx'
    'xxx'.padEnd(2, 'ab') // 'xxx'
    
    • 1
    • 2

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

    'abc'.padStart(10, '0123456789')
    // '0123456abc'
    
    • 1
    • 2

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

    'x'.padStart(4) // '   x'
    'x'.padEnd(4) // 'x   '
    
    • 1
    • 2

    padStart()的常见用途是为数值补全指定位数。下面代码生成 10 位的数值字符串。

    '1'.padStart(10, '0') // "0000000001"
    '12'.padStart(10, '0') // "0000000012"
    '123456'.padStart(10, '0') // "0000123456"
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    另一个用途是提示字符串格式。

    '12'.padStart(10, 'YYYY-MM-DD') // "YYYY-MM-12"
    '09-12'.padStart(10, 'YYYY-MM-DD') // "YYYY-09-12"
    
    • 1
    • 2
    5.8 实例方法:trimStart(),trimEnd()

    ES2019 对字符串实例新增了trimStart()trimEnd()这两个方法。

    它们的行为与trim()一致,trimStart()消除字符串头部的空格,trimEnd()消除尾部的空格。它们返回的都是新字符串,不会修改原始字符串。

    const s = '  abc  ';
    
    s.trim() // "abc"
    s.trimStart() // "abc  "
    s.trimEnd() // "  abc"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    上面代码中,trimStart()只消除头部的空格,保留尾部的空格。trimEnd()也是类似行为。

    除了空格键,这两个方法对字符串头部(或尾部)的 tab 键、换行符等不可见的空白符号也有效。

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

    5.9 实例方法:matchAll()

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

    5.10 实例方法:replaceAll()

    历史上,字符串的实例方法replace()只能替换第一个匹配。

    'aabbcc'.replace('b', '_')
    // 'aa_bcc'
    
    • 1
    • 2

    在这里插入图片描述

    上面例子中,replace()只将第一个b替换成了下划线。

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

    'aabbcc'.replace(/b/g, '_')
    // 'aa__cc'
    
    • 1
    • 2

    在这里插入图片描述

    正则表达式毕竟不是那么方便和直观,ES2021 引入了replaceAll()方法,可以一次性替换所有匹配。

    'aabbcc'.replaceAll('b', '_')
    // 'aa__cc'
    
    • 1
    • 2

    在这里插入图片描述

    它的用法与replace()相同,返回一个新字符串,不会改变原字符串。

    String.prototype.replaceAll(searchValue, replacement)
    
    • 1

    上面代码中,searchValue是搜索模式,可以是一个字符串,也可以是一个全局的正则表达式(带有g修饰符)。

    如果searchValue是一个不带有g修饰符的正则表达式,replaceAll()会报错。

    这一点跟replace()不同。

    // 不报错
    'aabbcc'.replace(/b/, '_')
    
    // 报错
    'aabbcc'.replaceAll(/b/, '_')
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面例子中,/b/不带有g修饰符,会导致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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    replaceAll()的第二个参数replacement除了为字符串,也可以是一个函数,该函数的返回值将替换掉第一个参数searchValue匹配的文本。

    'aabbcc'.replaceAll('b', () => '_')
    // 'aa__cc'
    
    • 1
    • 2

    上面例子中,replaceAll()的第二个参数是一个函数,该函数的返回值会替换掉所有b的匹配。

    这个替换函数可以接受多个参数。第一个参数是捕捉到的匹配内容,第二个参数捕捉到是组匹配(有多少个组匹配,就有多少个对应的参数)。此外,最后还可以添加两个参数,倒数第二个参数是捕捉到的内容在整个字符串中的位置,最后一个参数是原字符串。

    const str = '123abc456';
    const regex = /(\d+)([a-z]+)(\d+)/g;
    
    function replacer(match, p1, p2, p3, offset, string) {
      return [p1, p2, p3].join(' - ');
    }
    
    str.replaceAll(regex, replacer)
    // 123 - abc - 456
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上面例子中,正则表达式有三个组匹配,所以replacer()函数的第一个参数match是捕捉到的匹配内容(即字符串123abc456),后面三个参数p1p2p3则依次为三个组匹配。

    5.11 实例方法:at()

    at()方法接受一个整数作为参数,返回参数指定位置的字符,支持负索引(即倒数的位置)。

    const str = 'hello';
    str.at(1) // "e"
    str.at(-1) // "o"
    
    • 1
    • 2
    • 3

    如果参数位置超出了字符串范围,at()返回undefined

  • 相关阅读:
    微信小程序:EventChannel实现页面间事件通信通道
    这份文档太关键了,阿里开发6年JavaP7工程师深知MySQL重要性(建议看看)
    指针和数组笔试题解析
    CentOS Install Passenger for ROR
    Vue常用但记不住的操作
    喜报!震坤行荣登“2023上海百强企业”两项百强榜单!
    jQuery基础教程
    【 OpenGauss源码学习 —— 列存储(CStore)(一)】
    成人教育:毕业信息自我鉴定
    【ROS】RViz2源码分析(二):main函数及编译配置详解
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/127858919