24

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

目前我正在使用:

var myString = '';
for (var i = 0; i <= 65535; ++i) {
    myString += 'x';
}
4

5 回答 5

61

这是一个前瞻性的答案,在当前的实现中不起作用。

ECMAScript 6 当前正在定义一种String.prototype.repeat方法。这将允许您执行以下操作:

var result = "x".repeat(65535);

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

当前草案:

15.5.4.21 String.prototype.repeat(计数)

采取以下步骤:

  1. 让。O_CheckObjectCoercible(this value)
  2. 让。S_ToString(O)
  3. ReturnIfAbrupt(S).
  4. n成为调用的结果ToInteger(count)
  5. ReturnIfAbrupt(n).
  6. 如果n < 0,则抛出 RangeError 异常。
  7. 如果n+Infinity,则抛出 RangeError 异常。
  8. T是一个String由附加n副本组成的值。S如果n0T则为空字符串。
  9. 返回T

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

注 2:repeat 函数是故意通用的;它不需要它的this值是String对象。因此,它可以转移到其他类型的对象中作为方法使用。

于 2013-06-02T17:32:30.370 回答
53

怎么样

Array(65537).join('x')

请注意,它是 65537,而不是 65536,因为您在其间放置了字符。

于 2013-06-02T17:24:50.747 回答
10

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

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

这使您可以从创建字符串的本机函数中受益,而无需庞大数组的开销。

于 2013-06-02T18:15:35.410 回答
6

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

http://jsperf.com/mkstring

参赛者是

  1. 数组(x).join()

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

  3. strRepeat from underscore.string

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);

  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 函数慢。因此,如果您正在寻找一种快速的方法,请不要使用它。

于 2015-01-08T15:43:25.673 回答
2

您可以创建一个任意长度的数组,然后使用join()数组上的方法将其变成一个字符串。Array(number).join(char)这会在 size 上创建一个数组number -1。另请注意,您不想使用您的方法,因为连接字符串非常昂贵(每个连接 O(n))。我不确定 javascript 是否有类似 java 的 StringBuilder

于 2013-06-02T17:25:29.730 回答