Answers:
如今,repeat
字符串方法几乎在所有地方都已实现。(它不在Internet Explorer中。)因此,除非需要支持较旧的浏览器,否则只需编写以下内容:
"a".repeat(10)
在之前repeat
,我们使用了此技巧:
Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"
(请注意,长度为11的数组只会使您获得10个“ a”,因为Array.join
将参数放在数组元素之间。)
Simon还指出,根据该jsperf的说明,在Safari和Chrome(但不是Firefox)中,通过简单地使用for循环附加(虽然不太简洁)多次重复一个字符似乎更快。
Array(rawValue.length + 1).join("*")
Array(n+1).join("a")
。当n = 0时,它返回空字符串,而当n = 1时,它返回"a"
。因此,我认为它在所有情况下均有效。
如果重复很多,这很方便:
String.prototype.repeat = String.prototype.repeat || function(n){
n= n || 1;
return Array(n+1).join(this);
}
alert( 'Are we there yet?\nNo.\n'.repeat(10) )
repeat(str, n)
。
n= n || 1
零件(或检查是否n
未定义),以便您也可以重复0
次数。
String.repeat
仅在ES6中添加,直到2015年6月才最终确定。因此,我认为我的观点在2012
性能最佳的方法是https://developer.mozilla.org/zh-CN/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;
}
}
count >>>= 1, pattern += pattern;
吗?这是什么样的说法?
if (!String.prototype.repeat) {
在开头和}
结尾处添加一个即可。
以下功能比接受的答案中建议的选项执行速度快得多:
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。表格中的数字指定了完全支持该方法的第一个浏览器版本:
/**
* 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"
);
在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())
};
这是我使用的:
function repeat(str, num) {
var holder = [];
for(var i=0; i<num; i++) {
holder.push(str);
}
return holder.join('');
}
我将扩展@bonbon的答案。他的方法是一种“将N个字符附加到现有字符串上”的简单方法,以防万一有人需要这样做。例如,由于“ a google”是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>
注意:您必须将原始字符串的长度添加到条件字符串中。
Lodash提供的功能类似于Java的repeat()函数,并非所有浏览器都可用。它称为_.repeat,自版本3.0.0起可用:
_.repeat('a', 10);
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"
String.prototype.repeat
当前浏览器中固有的内容。另外,为什么要缩小呢?您无需全部写成一行。