JS將字符串重復(fù)N次的repeat方法的8個(gè)版本

JS將字符串重復(fù)N次的repeat方法的8個(gè)版本

/*
*@desc: 將一個(gè)字符串重復(fù)自身N次
*/

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

//版本2:之所以要?jiǎng)?chuàng)建一個(gè)帶length屬性的對(duì)象 是因?yàn)橐{(diào)用數(shù)據(jù)的原型方法晚缩,需要指定call的第一個(gè)參數(shù)為類數(shù)組對(duì)象
//類數(shù)組對(duì)象的必要條件是其length屬性的值為非負(fù)數(shù)
function repeat(target, n) {
    return Array.prototype.join.call({
        length: n + 1
    }, target);
}

//版本3:利用閉包將類數(shù)組對(duì)象與數(shù)組原型的join方法緩存起來(lái)
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;//如果是奇數(shù)
        }
        if (n == 1) {
            break;
        }

        s += s;
        n = n >> 1;//相當(dāng)于將n除以2取其商荞彼,或者說(shuō)是開(kāi)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;//相當(dāng)于將n除以2取其商卿泽,或者說(shuō)是開(kāi)2次方
    }
    return total;
}
//版本6:版本4的變樣版本   免去創(chuàng)建數(shù)組與使用join方法   但在循環(huán)中創(chuàng)建字符串比要求的還長(zhǎng)  所以...
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的優(yōu)化版本
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));
}

代碼轉(zhuǎn)自靜逸的博客

分別運(yùn)行8個(gè)方法莺债,執(zhí)行repeat(1,200000000),每個(gè)方法運(yùn)行50次签夭,得出的結(jié)果(平均值)

  • 版本1 88ms
  • 版本2 瀏覽器崩潰
  • 版本3 瀏覽器崩潰
  • 版本4 <1ms
  • 版本5 <1ms
  • 版本6 報(bào)錯(cuò)(詳見(jiàn)代碼注釋)
  • 版本7 <1ms
  • 版本8 瀏覽器崩潰
版本4,5,7都是通過(guò)二分法進(jìn)行repeat齐邦,版本5較版本4免去了join方法,版本7對(duì)版本5的代碼進(jìn)行優(yōu)化第租,可能測(cè)試使用的數(shù)據(jù)不太合適措拇,雖然版本4,5,7的用時(shí)都很小,但代碼上看慎宾,應(yīng)該是版本5丐吓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末浅悉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子券犁,更是在濱河造成了極大的恐慌,老刑警劉巖粘衬,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件荞估,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡稚新,警方通過(guò)查閱死者的電腦和手機(jī)勘伺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)褂删,“玉大人飞醉,你說(shuō)我怎么就攤上這事⊥头В” “怎么了缅帘?”我有些...
    開(kāi)封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蹲盘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)膳音,這世上最難降的妖魔是什么召衔? 我笑而不...
    開(kāi)封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮祭陷,結(jié)果婚禮上苍凛,老公的妹妹穿的比我還像新娘。我一直安慰自己兵志,他們只是感情好醇蝴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著想罕,像睡著了一般悠栓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上按价,一...
    開(kāi)封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天惭适,我揣著相機(jī)與錄音,去河邊找鬼楼镐。 笑死癞志,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的框产。 我是一名探鬼主播凄杯,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼错洁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了戒突?” 一聲冷哼從身側(cè)響起屯碴,我...
    開(kāi)封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妖谴,沒(méi)想到半個(gè)月后窿锉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膝舅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年嗡载,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仍稀。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洼滚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出技潘,到底是詐尸還是另有隱情遥巴,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布享幽,位于F島的核電站铲掐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏值桩。R本人自食惡果不足惜摆霉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奔坟。 院中可真熱鬧携栋,春花似錦、人聲如沸咳秉。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)澜建。三九已至向挖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炕舵,已是汗流浹背户誓。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留幕侠,地道東北人帝美。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親悼潭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庇忌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355