replaceAll函数:脚本执行时间太长

时间:2014-05-08 12:11:18

标签: javascript html

这是我的代码:

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

5 个答案:

答案 0 :(得分:2)

我更喜欢这样做。

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”替换为“> -1”并从“this.replace(search,replace);”返回。你必须放入一个变量,因为“替换”函数不会改变“this”的值,只返回新的字符串值。

答案 1 :(得分:1)

您可以使用内置替换功能实现所需,但将g标志附加到正则表达式 即。

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

答案 2 :(得分:0)

String#replace返回字符串;因此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;
};

另请注意,它是unadvised to modify native prototypes

答案 3 :(得分:0)

我发现这种方法更好:

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

    return this.replace(new RegExp(search, 'g'), replace);
};

答案 4 :(得分:0)

我更喜欢与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))

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