避免这样使用replace函数

记录一次使用replace函数的翻车过程。

根据用户输入的开始时间和有效期限来判断驾驶证是否,判断逻辑如下:

 a(年月日) + b(年) ? (当前时间 年月日) return : false

小需求,然后风风火火的写下了如下的代码

function fn1(start, step) { 
    var newTime = start.replace(/(\d{4})/, Number('$1') + step)
    var loseTime = new Date(newTime).getTime()
    var nowTime = new Date().getTime()
    console.log(newTime)
    return loseTime > nowTime
}
fn1('2017-11-14', 1)   // NaN-11-14

看了看代码,觉得应该是 Number('$1') 里面的$1没有取到值,js将它解析成了字符串'$1',就出现了NaN。

不使用Number()没有问题,打印20171-11-14,+号也不行。算了,换个方式,再搞下。

查资料理解到replace里面的$1可以忽略RegExp,可以直接写成$1,那要是加上呢,会不会就好了?

此时,坑开始了

然后我就写下了如下的代码

function fn1(start, step) { 
    var newTime = start.replace(/(\d{4})/, Number(RegExp.$1) + step)
    var loseTime = new Date(newTime).getTime()
    var nowTime = new Date().getTime()
    console.log(newTime)
    return loseTime > nowTime
}
fn1('2017-11-14', 1)   // 1-11-14
fn1('2017-11-14', 1)   // 2018-11-14
图片.png

什么鬼,让我冷静下。第一次调用难道没有获取到正则匹配到的值吗?

打断点,我瞅瞅,果然如此,第一次调用的时候RegExp.$1' ',看来我得重新理解下replace这个函数了。

我的理解是匹配到的字符串赋值给了RegExp.$1,看来并不是这样,它是表明上次匹配到的值。

知道了原因,就有改进的方法了,这里我列出3种:

1、在匹配的时候,先计算出要替换成的值

function fn2(start, step) {
    let year = Number(start.split('-')[0]) + step // 看这里看这里
    var newTime = start.replace(/(\d{4})/, year)
    var loseTime = new Date(newTime).getTime()
    var nowTime = new Date().getTime()
    console.log(newTime)
    return loseTime > nowTime
} 

2、将replace函数的第二个值改成函数(推荐写法)

function fn3(start, step) {
    var newTime = start.replace(/\d{4}/, (a,b,c)=>{
     //  a 匹配到的值  b匹配到值的下标 c原始字符
      return Number(a) + step
    })
    var loseTime = new Date(newTime).getTime()
    var nowTime = new Date().getTime()
    console.log(newTime)
    return loseTime > nowTime
}

3、先将RegExp.$1赋值,再使用

function fn4(start, step) {
    /(\d{4})/.test(start)
    var newTime = start.replace(/(\d{4})/, Number(RegExp.$1) + step)
    var loseTime = new Date(newTime).getTime()
    var nowTime = new Date().getTime()
    console.log(newTime)
    return loseTime > nowTime
}

总结:

碰到replace函数要计算替换值的时候,最好直接写成函数,开始的bug我的理解是Number函数执行的时候,正则还没有将$1赋值,或者就不能这样写,这样写的话,replace函数就把$1当前普通字符串来解析了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,446评论 0 4
  • 本章内容 使用对象 创建并操作数组 理解基本的 JavaScript 类型 使用基本类型和基本包装类型 引用类型的...
    闷油瓶小张阅读 3,921评论 0 0
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 5,605评论 0 6
  • 在一个家庭里,都说要有两个孩子,一个太孤单,三个太吵。但这都是大人的想法,你又不是孩子,你怎么知道孩子的想法...
    偶然思绪阅读 1,898评论 0 0
  • 这是来自七月里最后的一天七月还是要结束,于是我又开始等待下一个七月。如同,我等待四月一样时日久远可能已经忘记了我为...
    子君与雨阅读 1,345评论 2 0