Javascript .replaceAll()不是函数类型错误

af7jpaap  于 2023-01-29  发布在  Java
关注(0)|答案(8)|浏览(278)

文档页面:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replaceAll

let string = ":insertx: :insertx: :inserty: :inserty: :insertz: :insertz:";
let newstring = string.replaceAll(":insertx:", 'hello!');

当我运行这个函数时,我收到了Uncaught TypeError: string.replaceAll is not a function,也许我误解了什么是原型,但是这个函数看起来是一个可以使用的字符串方法。
我用的是Chrome。

oknrviil

oknrviil1#

replace与带有global修饰符的正则表达式一起使用,可以获得更好的浏览器支持(查看MDN上的浏览器兼容性表,查看每个浏览器的哪个版本开始支持replaceAll方法)。

let string = ":insertx: :insertx: :inserty: :inserty: :insertz: :insertz:";
let newstring = string.replace(/:insertx:/g, 'hello!');
console.log(newstring);

对于更通用的解决方案,我们可以转义正则表达式元字符并使用RegExp构造函数,也可以将函数作为多边形填充添加到String.prototype中。
(It必须对要替换的字符串进行转义,以便按字面解释正则表达式中具有特殊含义的字符,例如.将仅引用实际的点而不是任何字符。)

//Taken from https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
function escapeRegExp(string) {
  return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
}
function replaceAll(str, match, replacement){
   return str.replace(new RegExp(escapeRegExp(match), 'g'), ()=>replacement);
}

console.log(replaceAll('a.b.c.d.e', '.', '__'));
console.log(replaceAll('a.b.c.d.e', '.', '$&'));

可在here中找到符合规范的垫片。

qxsslcnc

qxsslcnc2#

.replaceAll将从Chrome 85开始提供。当前版本为83。
如果你下载了Google Chrome Canary(86版),你会发现你的代码运行得很好。Firefox是78版,而且.replaceAll从77版开始就可以使用了,它在78版也可以使用。它在当前的Safari上也可以使用。微软Edge不支持它。
您可以在问题的文章底部找到支持的浏览器版本。

dfty9e19

dfty9e193#

如果您不想升级Chrome浏览器,也不想使用reg表达式(因为它们的性能较低),您也可以这样做:

let string = ":insertx: :insertx: :inserty: :inserty: :insertz: :insertz:";
let newstring = string.split(":insertx:").join('hello!');

当然,如果你想在任何地方都附加String原型,你也可以这样做,但是因为真实的的replaceAll包含了更多的特性(支持正则表达式),所以你可以更安全地这样做:

String.prototype.replaceAllTxt = function replaceAll(search, replace) { return this.split(search).join(replace); }
6ju8rftf

6ju8rftf4#

您可以自己轻松定义:

if(typeof String.prototype.replaceAll === "undefined") {
    String.prototype.replaceAll = function(match, replace) {
       return this.replace(new RegExp(match, 'g'), () => replace);
    }
}

并使用它:

"fafa".replaceAll("a", "o");
>>> fofo
polkgigr

polkgigr5#

ES2021 ES12中添加了str.replaceAll函数,这就是为什么旧版本的浏览器和nodejs中没有定义它的原因。

kyvafyod

kyvafyod6#

虽然有点离题,但我无意中在这里为我的用例,这是没有列出,所以这里是为像我这样的人。我需要隐藏一个词,但如果它开始与某些字符,即发展。和,有通配符****,帮助我做到这一点。

'Fullstack developer'.replace(/dev.*/g, '') // => Fullstack

注意:注意点。

imzjd6km

imzjd6km7#

我也得到了相同的类型错误问题与replace All。我解决了它与replace方法与正则表达式与全局标志集。

let unformattedDate = "06=07=2022";
const formattedString = unformattedDate.replace(/=/g, ':');
console.log(formattedString);
yqkkidmi

yqkkidmi8#

由于我对Regex不太熟悉,我编写了一个简单的变通方法来获得与以前相同的结果。在示例中,我希望用“X”替换所有空格。

while (myString.includes(' ')) 
{
 myString = myString.replace(' ', 'X')
}

因此,只要找到要替换的子字符串,就可以遍历字符串。

相关问题