[javascript] 문자 N 번 반복

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);
// → '***

https://lodash.com/docs#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);

이 기능의 성능과 허용 된 답변에서 제안 된 옵션의 성능을 비교하려면 이 Fiddle이 Fiddle 에서 벤치 마크를 참조하십시오 .

최신 브라우저 전용

최신 브라우저에서는 다음 String.prototype.repeat방법을 사용하여이 작업을 수행 할 수 있습니다 .

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

MDN 에서이 방법에 대해 자세히 알아보십시오 .

이 옵션은 더 빠릅니다. 불행히도 어떤 버전의 Internet Explorer에서도 작동하지 않습니다. 표의 숫자는이 방법을 완전히 지원하는 첫 번째 브라우저 버전을 지정합니다.

여기에 이미지 설명을 입력하십시오