replaceAll报错,半夜被疯狂@

603 阅读2分钟

真的是血泪教训啊,2022了,没想到还有人在用谷歌79版本...当然,这不是用户的问题,是我的问题😊

前几天半夜,正在静静刷手机,不知道过了多久,看到工作软件未读消息5+,我是个万事静音的人,除非别人@我,或者私聊才会有消息,小脑袋里满是问号,谁半夜找我呢?

点进去看,就是这样一个截图报错,功能用不了。。。

image.png

第一反应:不至于吧,这个功能上了这么久了,怎么可能报错呢。

然后就被啪啪打脸。

emmm,由于我看到消息已经过了一段时间,于是看到了用户的自力更生。

他说:“升级浏览器后好了。”

emmm,咱必须给这位用户点赞。

但是,我就开始思考了,也不是所有用户都有这样的自觉呀,而且强迫用户升级浏览器,这开发也太骄傲了吧,木秀于林,风必摧之。

于是,我就来解决这个问题。

问题原因

首先说下原因,replaceAll确实有兼容问题,谷歌只支持85及以上版本

image.png

解决方案

方案一:用无兼容问题的replace

image.png

replace虽无兼容问题,但无法替换所有,如果要替换所有,可以用正则/g

title = title.replace(/ /g, '_') // 把所有空格替换为下划线

此时,还有另一处,我要替换的是多个变量,直接用以上方案,无法替换,可以这样用

let string = '999${f}888${f}'
let key = '${f}'
let res = string.replace(new RegExp(key,'g'), 'abc')
console.log(res) // '999${f}888${f}'

但是!此时的替换并未生效

又用上我熟悉的搜索大法,才知道,原来替换变量时,变量要是正则表达式,因此完整的多个变量替换方案如下:

let string = '999${f}888${f}'
let key = '\\$\\{f\\}'
let res = string.replace(new RegExp(key,'g'), 'abc')
console.log(res) // 999abc888abc

方案二:改写replaceAll

其实就是当不支持replaceAll时,用replace替换

if(!String.prototype.replaceAll){

    String.prototype.replaceAll = function (newString, oldString) {

        return this.replace(new RegExp("oldString", "g"), "newString")

    }

}

解决完毕,休息~