美文网首页
JS将字符串重复N次的repeat方法的8个版本

JS将字符串重复N次的repeat方法的8个版本

作者: 流浪的三鮮餡 | 来源:发表于2017-11-24 17:50 被阅读111次

JS将字符串重复N次的repeat方法的8个版本

/*
*@desc: 将一个字符串重复自身N次
*/

//版本1:利用空数组的join方法
function repeat(target, n) {
    return (new Array(n + 1)).join(target);
}

//版本2:之所以要创建一个带length属性的对象 是因为要调用数据的原型方法,需要指定call的第一个参数为类数组对象
//类数组对象的必要条件是其length属性的值为非负数
function repeat(target, n) {
    return Array.prototype.join.call({
        length: n + 1
    }, target);
}

//版本3:利用闭包将类数组对象与数组原型的join方法缓存起来
var repeat = (function () {
    var join = Array.prototype.join, obj = {};
    return function (target, n) {
        obj.length = n + 1;
        return join.call(obj, target);
    }
})();

//版本4:使用二分法
function repeat(target, n) {
    var s = target, total = [];
    while (n > 0) {
        if (n % 2 == 1) {
            total[total.length] = s;//如果是奇数
        }
        if (n == 1) {
            break;
        }

        s += s;
        n = n >> 1;//相当于将n除以2取其商,或者说是开2次方
    }
    return total.join('');
}

//版本5:版本4的改良版本
function repeat(target, n) {
    var s = target, total = "";
    while (n > 0) {
        if (n % 2 == 1) {
            total += s;
        }
        if (n == 1) {
            break;
        }

        s += s;
        n = n >> 1;//相当于将n除以2取其商,或者说是开2次方
    }
    return total;
}
//版本6:版本4的变样版本   免去创建数组与使用join方法   但在循环中创建字符串比要求的还长  所以...
function repeat(target, n) {
    var s = target, c = s.length * n;
    do {
        s += s;
    } while (n = n >> 1);
    s = s.substring(0, c);
    return s;
} 

//版本7:版本5的优化版本
function repeat(target, n) {
    if (n == 1) {
        return target;
    }
    var s = repeat(target, Math.floor(n / 2));
    s += s;
    if (n % 2) {
        s += target;
    }
    return s;
}
//版本8:反例
function repeat(target, n) {
    return (n <= 0) ? "" : target.concat(repeat(target, --n));
}

代码转自静逸的博客

分别运行8个方法,执行repeat(1,200000000),每个方法运行50次,得出的结果(平均值)

  • 版本1 88ms
  • 版本2 浏览器崩溃
  • 版本3 浏览器崩溃
  • 版本4 <1ms
  • 版本5 <1ms
  • 版本6 报错(详见代码注释)
  • 版本7 <1ms
  • 版本8 浏览器崩溃
版本4,5,7都是通过二分法进行repeat,版本5较版本4免去了join方法,版本7对版本5的代码进行优化,可能测试使用的数据不太合适,虽然版本4,5,7的用时都很小,但代码上看,应该是版本5。

相关文章

网友评论

      本文标题:JS将字符串重复N次的repeat方法的8个版本

      本文链接:https://www.haomeiwen.com/subject/ddefbxtx.html