Perl에서는 다음 구문을 사용하여 문자를 여러 번 반복 할 수 있습니다.
$a = "a" x 10; // results in "aaaaaaaaaa"
Javascript에서 이것을 달성하는 간단한 방법이 있습니까? 분명히 함수를 사용할 수는 있지만 내장 접근법이나 다른 영리한 기술이 있는지 궁금합니다.
답변
요즘 repeat
문자열 방법 은 거의 모든 곳에서 구현 됩니다. ( Internet Explorer 에는 없습니다 .) 따라서 이전 브라우저를 지원해야하는 경우가 아니면 간단히 다음과 같이 작성할 수 있습니다.
"a".repeat(10)
전에는 repeat
이 핵을 사용했습니다 :
Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"
(길이 11 의 배열은 배열 요소 사이 에 Array.join
인수 를 두기 때문에 10 “a”만 가져 옵니다.
Simon은 또한 이 jsperf 에 따르면 Safari와 Chrome (Firefox는 아님)에서 for 루프를 사용하여 문자를 여러 번 반복하는 것이 더 빠르다는 것을 나타냅니다 (약간 간결하지만).
답변
새로운 ES6 하모니에서는 반복 하여 기본 작업을 수행 할 수 있습니다 . 또한 ES6은 현재 실험용이므로 Edge, FF, Chrome 및 Safari에서 이미 사용할 수 있습니다 .
"abc".repeat(3) // "abcabcabc"
그리고 반복 기능을 사용할 수 없다면 구식을 사용할 수 있습니다. Array(n + 1).join("abc")
답변
자신을 많이 반복하면 편리합니다.
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) )
답변
가장 성능이 좋은 방법은 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의 폴리 필 :
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')
답변
프로젝트에 라이브러리를 포함하는 것을 반대하지 않는다면 lodash는 반복 기능을 가지고 있습니다.
_.repeat('*', 3);
// → '***
답변
모든 브라우저
다음 기능은 허용 된 답변에서 제안 된 옵션보다 훨씬 빠르게 수행됩니다.
var repeat = function(str, count) {
var array = [];
for(var i = 0; i < count;)
array[i++] = str;
return array.join('');
}
다음과 같이 사용하십시오.
var repeatedString = repeat("a", 10);
이 기능의 성능과 허용 된 답변에서 제안 된 옵션의 성능을 비교하려면 이 Fiddle 및 이 Fiddle 에서 벤치 마크를 참조하십시오 .
최신 브라우저 전용
최신 브라우저에서는 다음 String.prototype.repeat
방법을 사용하여이 작업을 수행 할 수 있습니다 .
var repeatedString = "a".repeat(10);
MDN 에서이 방법에 대해 자세히 알아보십시오 .
이 옵션은 더 빠릅니다. 불행히도 어떤 버전의 Internet Explorer에서도 작동하지 않습니다. 표의 숫자는이 방법을 완전히 지원하는 첫 번째 브라우저 버전을 지정합니다.
