在 JavaScript 中重复一个字符串多次

IT技术 javascript string character repeat
2021-01-17 04:01:55

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

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

有没有一种简单的方法可以在 Javascript 中完成此操作?我显然可以使用一个函数,但我想知道是否有任何内置方法或其他一些聪明的技术。

6个回答

这些天来,该repeat字符串的方法来实现,几乎无处不在。(它不在 Internet Explorer 中。)所以除非您需要支持旧浏览器,否则您可以简单地编写:

"a".repeat(10)

之前repeat,我们使用了这个 hack:

Array(11).join("a") // create string with 10 a's: "aaaaaaaaaa"

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

Simon 还指出,根据这个基准测试,在 Safari 和 Chrome(但不是 Firefox)中,通过简单地使用 for 循环(虽然不太简洁)重复多次重复一个字符似乎更快。

循环方法可能更快,但更冗长。另外,我对第一条评论的所有赞成票感到困惑,考虑到当数组长度可变时,这通常会很有用,例如Array(rawValue.length + 1).join("*")
2021-03-13 04:01:55
@Neel 那是因为 JS 引擎对字符串长度施加了限制。在 Chrome 和 Firefox 中,限制接近 2^30(约十亿)。10^12 是一万亿。
2021-03-19 04:01:55
另外,您可以使用变量而不是固定长度 - Array(20-len),比如将字符串填充到 20。
2021-04-03 04:01:55
公式是Array(n+1).join("a")当 n=0 时,返回空字符串,当 n=1 时,返回"a"所以我认为它适用于所有情况。
2021-04-05 04:01:55
@Bashir 是正确的,IE 不支持这个:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-08 04:01:55

在新的 ES6 和声中,您将有使用repeat执行此操作的原生方式ES6 目前还只是实验性的,这个功能已经在 Edge、FF、Chrome 和 Safari 中可用

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

当然,如果重复功能不可用,您可以使用 old-good 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)  )

@ChrisV,String.repeat仅在 ES6 中添加,直到 2015 年 6 月才最终确定。所以我认为我的观点在我 2012 年编写时是有效的。:)
2021-03-15 04:01:55
@nurettin 请参阅programmers.stackexchange.com/questions/104320/...了解更多讨论。我会添加一个(适当范围的)静态辅助函数,签名为repeat(str, n).
2021-03-23 04:01:55
污染内置程序的原型是一种糟糕的编码习惯。
2021-04-03 04:01:55
我会删除该n= n || 1部分(或检查是否n未定义),因此您也可以重复0多次。
2021-04-05 04:01:55
也可以看看 Mozilla 的 ES6 官方 polyfill:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-04-09 04:01:55

另一种选择是:

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

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

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

注意:您不必像word = Array(11).join('a')

最有效的方式是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;
  }
}
这是一个很好的方法,但新的原生“重复”甚至更快,不需要实现,无论如何,谢谢!
2021-03-16 04:01:55
所以这是原生重复的 polyfill,然后呢?只需if (!String.prototype.repeat) {在开头和}结尾添加一个
2021-03-25 04:01:55
你能详细说明一下的意思count >>>= 1, pattern += pattern;吗?是什么样的声明?
2021-03-26 04:01:55
>>>= 是无符号右移赋值(如 count = count >>> 1)参见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-30 04:01:55