如何创建一个包含n个字符的字符串?如何创建具有特定长度的字符串?

Vic*_*sky 17 javascript string

我正在编写JavaScript单元测试,我需要创建一个长度为65536的字符串.在JavaScript中执行此操作的最佳方法是什么?

目前我正在使用:

var myString = '';
for (var i = 0; i <= 65535; ++i) {
    myString += 'x';
}
Run Code Online (Sandbox Code Playgroud)

azt*_*tek 37

怎么样

Array(65537).join('x')
Run Code Online (Sandbox Code Playgroud)

注意,它是65537,而不是65536,因为你把字符放在中间.

  • 对于大字符串,`join` 比 `repeat` 慢得多 (3认同)

小智 30

这是一个前瞻性的答案,并不适用于当前的实现.

ECMAScript 6目前正在定义一种String.prototype.repeat方法.这将允许您:

var result = "x".repeat(65535);
Run Code Online (Sandbox Code Playgroud)

同样,这是未来的补充.目前正在起草ECMAScript 6(Harmony),这在技术上可以删除,但似乎不太可能.

目前的草案:

15.5.4.21 String.prototype.repeat(count)

采取以下步骤:

  1. 我们OCheckObjectCoercible(this value).
  2. 我们SToString(O).
  3. ReturnIfAbrupt(S).
  4. 让我们n成为召唤的结果ToInteger(count).
  5. ReturnIfAbrupt(n).
  6. 如果n < 0,则抛出RangeError异常.
  7. 如果n+Infinity,则抛出RangeError异常.
  8. 我们T是一个String被制成值n的副本S附加到一起.如果n0,T则是空字符串.
  9. 返回T.

注1:此方法创建一个String,该字符串由此对象的字符串元素(转换为String)重复计数时间组成.

注2:重复功能是故意通用的; 它不要求它的这个值是一个String对象.因此,它可以转移到其他类型的对象以用作方法.

  • 2015年更新:ECMAScript 2015已经定稿,这个在里面,所以使用起来绝对安全。目前 Chrome 和 Firefox 支持此功能,IE 或 Safari 不支持。MDN 有一个可用的polyfill。 (2认同)

Pau*_* S. 8

Array.prototype.join不必在Array上调用,只需要一个具有length属性的Object(在Google Chrome,FireFox,IE10中测试)

function makeStr(len, char) {
    return Array.prototype.join.call({length: (len || -1) + 1}, char || 'x');
}
makeStr(5); // "xxxxx"
Run Code Online (Sandbox Code Playgroud)

这使您可以从制作字符串的本机函数中受益,而无需大量数组的开销.

  • 我喜欢!Array.prototype.join.call({length:65537},'x'); (2认同)

cbl*_*ley 5

出于兴趣,我在 jsperf.com 上创建了一个快速基准测试:

http://jsperf.com/mkstring

参赛者是

  1. 数组(x).join()

  2. Array.prototype.join 由 Paul S 发布。

  3. 来自underscore.string 的strRepeat

function strRepeat(str, qty) {
  if (qty < 1) return '';
  var result = '';
  while (qty > 0) {
    if (qty & 1) result += str;
    qty >>= 1, str += str;
  }
  return result;
}

strRepeat('*', 20000);
Run Code Online (Sandbox Code Playgroud)

  1. Crayz Train 提到的 EMCAScript 6 String.repeat

对于 Firefox 34(已经支持 ECMAScript6 String.repeat),原生重复是最快的,其次是 strRepeat。

有趣的是,在我的测试运行中,与 Firefox 的原生 String.repeat 函数相比,Chrom(e|ium) 39 的 strRepeat 函数甚至更快。

对于所有经过测试的浏览器,Paul S. 提出的使用原生 Array.join 方法的函数比 underscore.string 库的 strRepeat 函数慢。因此,如果您正在寻找快速方法,请不要使用它。