replaceAll函数:脚本太长而无法执行

replaceAll function : Script too long to execute

本文关键字:执行 函数 脚本 replaceAll      更新时间:2023-09-26

这是我的代码:

String.prototype.replaceAll = function(search, replace){
    if(!replace){
        return this;
    }
    while(this.indexOf(search) !== false){
        this.replace(search, replace);
    }
    return this;
};

我想它应该可以工作,但是它没有。

代码应该是这样工作的:

var x="hihi";
x.replaceAll("hi", "i");

最后x的值应该是:

ii

我更喜欢这样做。

String.prototype.replaceAll = function (search, replace) {
    var str = this;
    var pos = str.indexOf(search);
    while (pos > -1) {
        str = str.replace(search, replace);
        pos = str.indexOf(search);
    }
    return (str);
};

但是在您的情况下,您必须替换"! "== false" for "> -1"并从" this "返回。Replace (search, Replace);"您必须输入一个变量,因为"Replace"函数不会改变"this"的值,而只是返回新的字符串值。

您可能能够使用内置的替换函数实现您想要的功能,但将g标志附加到正则表达式例如

var x="hihi";
x='hihi'.replace(/hi/g, 'i');

我发现这种方法更好:

String.prototype.replaceAll = function(search, replace){
    if(!replace){
        return this;
    }
    return this.replace(new RegExp(search, 'g'), replace);
};

String#replace返回一个new字符串;因此,this永远不会改变。你需要做的是返回一个新的字符串,作为字符串(我认为)是不可变的。

String.prototype.replaceAll = function(search, replace){
    if(!replace){
        return this;
    }
    var str = this;
    while(~str.indexOf(search)){ // indexOf() doesn't return false
        str = str.replace(search, replace);
    }
    return str;
};

还要注意,不建议修改原生原型。

我更喜欢与indexOf结合使用的位非运算符

var a = ~'foo'.indexOf('o'), //-2, evaluates to true
    b = ~'foo'.indexOf('x'); // 0, evaluates to false

-1将求值为false,因为~-1 === 0,但任何正索引将返回一个负数,求值为true。因此,您可以简单地执行

while(~this.indexOf(search))

或者

while(!!~this.indexOf(search))

表示真正的布尔值(不是必需的)。