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

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

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

当前回答

简单的方法:

String.prototype.repeat = function(num) {
    num = parseInt(num);
    if (num < 0) return '';
    return new Array(num + 1).join(this);
}

其他回答

这是JSLint的安全版本

String.prototype.repeat = function (num) {
  var a = [];
  a.length = num << 0 + 1;
  return a.join(this);
};

disfated的答案提高了5-7%。

通过在计数> 1处停止来展开循环,并在循环之后执行额外的result += pattnern concat。这将避免循环最终使用以前未使用的模式+=模式,而不必使用昂贵的if检查。 最终的结果是这样的:

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;
    }
    result += pattern;
    return result;
};

下面是disfate的小提琴分叉的展开版本:http://jsfiddle.net/wsdfg/

使用数组(N + 1) . join(“string_to_repeat”)

简单的递归连接

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

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

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

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

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

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

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

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

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

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