返回任意次数的字符串的最佳或最简洁的方法是什么?

以下是我目前为止拍得最好的照片:

function repeat(s, n){
    var a = [];
    while(a.length < n){
        a.push(s);
    }
    return a.join('');
}

当前回答

只是另一个重复函数:

function repeat(s, n) {
  var str = '';
  for (var i = 0; i < n; i++) {
    str += s;
  }
  return str;
}

其他回答

String.prototype.repeat现在是ES6标准。

'abc'.repeat(3); //abcabcabc
function repeat(s, n) { var r=""; for (var a=0;a<n;a++) r+=s; return r;}

好消息!String.prototype.repeat现在是JavaScript的一部分。

"yo".repeat(2);
// returns: "yoyo"

除Internet Explorer外,所有主流浏览器都支持该方法。有关最新列表,请参见MDN: String.prototype.repeat >浏览器兼容性。

MDN为没有支持的浏览器提供了一个填充。

我已经测试了所有提议的方法的性能。

这是我找到的最快的变种。

String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
};

或作为独立函数:

function repeat(pattern, count) {
    if (count < 1) return '';
    var result = '';
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
}

它基于wnrph算法。 它真的很快。与传统的Array(count + 1).join(string)方法相比,计数越大,它的运行速度就越快。

我只改变了两件事:

replace pattern = this with pattern = this. valueof()(清除一个明显的类型转换); 增加if (count < 1)检查从prototypejs到函数的顶部,以排除在这种情况下不必要的操作。 应用优化从丹尼斯的答案(5-7%的速度提高)

UPD

为感兴趣的人准备了一个性能测试场地。

变量计数~ 0 ..100:

常量= 1024:

如果可以的话,使用它,让它更快:)

简单的递归连接

我只是想试一试,然后做了这个:

function ditto( s, r, c ) {
    return c-- ? ditto( s, r += s, c ) : r;
}

ditto( "foo", "", 128 );

我不能说我想得太多,它可能表明:-)

可以说这样更好

String.prototype.ditto = function( c ) {
    return --c ? this + this.ditto( c ) : this;
};

"foo".ditto( 128 );

这很像已经发布的答案-我知道。

但为什么要递归呢?

还有一点默认行为呢?

String.prototype.ditto = function() {
    var c = Number( arguments[ 0 ] ) || 2,
        r = this.valueOf();
    while ( --c ) {
        r += this;
    }
    return r;
}

"foo".ditto();

因为,尽管非递归方法将处理任意大的重复而不达到调用堆栈限制,但它要慢得多。

为什么我要费心添加更多的方法,而这些方法还不及已经发布的那些方法的一半聪明呢?

一部分是为了自娱自乐,一部分是为了用最简单的方式指出,我知道剥猫皮的方法有很多种,根据具体情况,显然最好的方法很可能并不理想。

一个相对快速和复杂的方法可能会在某些情况下有效地崩溃和烧毁,而一个更慢,更简单的方法可能最终会完成工作。

有些方法可能只是利用漏洞,因此很容易被修复而不复存在,而其他方法可能在所有条件下都工作得很好,但构造得太复杂,以至于人们根本不知道它是如何工作的。

“就算我不知道它是怎么工作的又怎样?!”

严重吗?

JavaScript有一个最大的优势;它对不良行为具有高度的容忍度,而且非常灵活,它会竭尽全力地返回结果,而如果它崩溃了,可能对每个人都更好!

“能力越大,责任越大”;-)

但更严肃和重要的是,尽管像这样的一般问题确实会以聪明的答案形式带来令人生畏的东西,如果没有其他的话,扩展了一个人的知识和视野,最终,手头的任务-使用结果方法的实际脚本-可能需要比建议的更少或更聪明一点。

这些“完美”的算法很有趣,但“一刀切”很少会比量身定制更好。

这篇布道是由于你睡眠不足和一时兴趣所致。 开始编码吧!