重复字符N次

在Perl中,我可以使用以下语法多次重复一个字符:

$a = "a" x 10; // results in "aaaaaaaaaa" 

有一个简单的方法来完成这个在Javascript中? 我明显可以使用一个函数,但是我想知道是否有内置的方法或其他一些聪明的技巧。

 Array(11).join("a") // create string with 10 as "aaaaaaaaaa" 

(请注意,长度为11的数组只能得到10个“a”,因为Array.join将参数放在数组元素之间 )。

Simon还指出,根据这个jsperf ,似乎Safari和Chrome(但不是Firefox)通过简单地使用for循环(尽pipe稍不简单 )附加多次来重复字符会更快。

在一个新的ES6和谐中,你将有自己的方式重复这样做。 另外ES6现在只是实验性的,这个function已经在Edge,FF,Chrome和Safari中可用

 "abc".repeat(3) // "abcabcabc" 

当然,如果重复函数不可用,您可以使用旧的Array(n + 1).join("abc")

方便,如果你重复自己很多:

 String.prototype.repeat= function(n){ n= n || 1; return Array(n+1).join(this); } alert('Are we there yet?\nNo.\n'.repeat(10)) 

性能最好的方法是https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/repeat

简短版本如下。

  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; }; var a = "a"; console.debug(a.repeat(10)); 

来自Mozilla的Polyfill:

 if (!String.prototype.repeat) { String.prototype.repeat = function(count) { 'use strict'; if (this == null) { throw new TypeError('can\'t convert ' + this + ' to object'); } var str = '' + this; count = +count; if (count != count) { count = 0; } if (count < 0) { throw new RangeError('repeat count must be non-negative'); } if (count == Infinity) { throw new RangeError('repeat count must be less than infinity'); } count = Math.floor(count); if (str.length == 0 || count == 0) { return ''; } // Ensuring count is a 31-bit integer allows us to heavily optimize the // main part. But anyway, most current (August 2014) browsers can't handle // strings 1 << 28 chars or longer, so: if (str.length * count >= 1 << 28) { throw new RangeError('repeat count must not overflow maximum string size'); } var rpt = ''; for (;;) { if ((count & 1) == 1) { rpt += str; } count >>>= 1; if (count == 0) { break; } str += str; } // Could we try: // return Array(count + 1).join(this); return rpt; } } 

另一种方法是:

 for(var word = ''; word.length < 10; word += 'a'){} 

如果您需要重复多个字符,请将您的条件:

 for(var word = ''; word.length < 10 * 3; word += 'foo'){} 

注意:您不必超过1,就像word = Array(11).join('a')

如果你不反对在你的项目中join一个库,lodash具有重复function。

 _.repeat('*', 3); // → '*** 

https://lodash.com/docs#repeat

在ES2015 / ES6中,您可以使用"*".repeat(n)

所以把这个添加到你的项目中,你就很好。

  String.prototype.repeat = String.prototype.repeat || function(n) { if (n < 0) throw new RangeError("invalid count value"); if (n == 0) return ""; return new Array(n + 1).join(this.toString()) }; 

对于所有的浏览器

以下函数的执行速度比接受的答案中build议的选项快很多:

 var repeat = function(str, count) { var array = []; for(var i = 0; i < count;) array[i++] = str; return array.join(''); } 

你会这样使用它:

 var repeatedString = repeat("a", 10); 

为了比较这个函数的性能和接受的答案中提出的选项的性能,看这个小提琴这个小提琴的基准。

仅适用于现代浏览器

在现代浏览器中,您现在可以使用String.prototype.repeat方法来执行此操作:

 var repeatedString = "a".repeat(10); 

在MDN上阅读有关此方法的更多信息。

这个选项更快。 不幸的是,它在Internet Explorer的任何版本中都不起作用。 表中的数字指定完全支持该方法的第一个浏览器版本:

在这里输入图像描述

快速重复n个字符的另一个有趣的方法是使用快速取幂algorithm的思想:

 var repeatString = function(string, n) { var result = '', i; for (i = 1; i <= n; i *= 2) { if ((n & i) === i) { result += string; } string = string + string; } return result; }; 
 /** * Repeat a string `n`-times (recursive) * @param {String} s - The string you want to repeat. * @param {Number} n - The times to repeat the string. * @param {String} d - A delimiter between each string. */ var repeat = function (s, n, d) { return --n ? s + (d || "") + repeat(s, n, d) : "" + s; }; var foo = "foo"; console.log( "%s\n%s\n%s\n%s", repeat(foo), // "foo" repeat(foo, 2), // "foofoo" repeat(foo, "2"), // "foofoo" repeat(foo, 2, "-") // "foo-foo" ); 
 Array(10).fill('a').join('') 

虽然最受投票的答案是更紧凑一点,用这种方法,你不必添加额外的数组项目。

为了在我的项目中重复一个值,我使用重复

例如:

 var n = 6; for (i = 0; i < n; i++) { console.log("#".repeat(i+1)) } 

但要小心,因为此方法已被添加到ECMAScript 6规范。

这是我使用的:

 function repeat(str, num) { var holder = []; for(var i=0; i<num; i++) { holder.push(str); } return holder.join(''); } 
 function repeatString(n, string) { var repeat = []; repeat.length = n + 1; return repeat.join(string); } repeatString(3,'x'); // => xxx repeatString(10,'🌹'); // => "🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹" 

我打算扩展@ bonbon的答案 。 他的方法是一个简单的方法来“附加N个字符到一个现有的string”,以防万一任何人需要这样做。 例如,因为“一个谷歌”是1,其次是100个零 。

 for(var google = '1'; google.length < 1 + 100; google += '0'){} document.getElementById('el').innerText = google; 
 <div>This is "a google":</div> <div id="el"></div> 

你也可以试试这个简单的函数,我在node.js核心源代码中find:

 function repeatString(str, len) { return Array.apply(null, { length: len + 1 }).join(str).slice(0, len) } 
 String.prototype.repeat = function (n) { n = Math.abs(n) || 1; return Array(n + 1).join(this || ''); }; // console.log("0".repeat(3) , "0".repeat(-3)) // return: "000" "000" 

Lodash提供了与所有浏览器都不可用的JavaScript重复()函数类似的function。 它被称为_.repeat ,从3.0.0版开始可用:

 _.repeat('a', 10); 
 var stringRepeat = function(string, val) { var newString = []; for(var i = 0; i < val; i++) { newString.push(string); } return newString.join(''); } var repeatedString = stringRepeat("a", 1); 

也可以用作单线:

 function repeat(str, len) { while (str.length < len) str += str.substr(0, len-str.length); return str; } 

在CoffeeScript中:

 ( 'a' for dot in [0..10]).join('') 

这是一个ES6版本

 const repeat = (a,n) => Array(n).join(a+"|$|").split("|$|"); repeat("A",20).forEach((a,b) => console.log(a,b+1))