我正在编写 JavaScript 单元测试,我需要创建一个长度为 65536 的字符串。在 JavaScript 中执行此操作的最佳方法是什么?
目前我正在使用:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
我正在编写 JavaScript 单元测试,我需要创建一个长度为 65536 的字符串。在 JavaScript 中执行此操作的最佳方法是什么?
目前我正在使用:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
这是一个前瞻性的答案,在当前的实现中不起作用。
ECMAScript 6 当前正在定义一种String.prototype.repeat
方法。这将允许您执行以下操作:
var result = "x".repeat(65535);
同样,这是未来的补充。目前 ECMAScript 6 (Harmony) 正在起草中,这在技术上可以被删除,尽管这似乎不太可能。
当前草案:
15.5.4.21 String.prototype.repeat(计数)
采取以下步骤:
- 让。
O
_CheckObjectCoercible(this value)
- 让。
S
_ToString(O)
ReturnIfAbrupt(S)
.- 让
n
成为调用的结果ToInteger(count)
。ReturnIfAbrupt(n)
.- 如果
n < 0
,则抛出 RangeError 异常。- 如果
n
是+Infinity
,则抛出 RangeError 异常。- 让
T
是一个String
由附加n
副本组成的值。S
如果n
是0
,T
则为空字符串。- 返回
T
。注 1 此方法创建一个由该对象的字符串元素组成的字符串(转换为字符串)重复计数时间。
注 2:repeat 函数是故意通用的;它不需要它的this值是String对象。因此,它可以转移到其他类型的对象中作为方法使用。
怎么样
Array(65537).join('x')
请注意,它是 65537,而不是 65536,因为您在其间放置了字符。
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"
这使您可以从创建字符串的本机函数中受益,而无需庞大数组的开销。
出于兴趣,我在 jsperf.com 上创建了一个快速基准测试:
参赛者是
数组(x).join()
Array.prototype.join 由 Paul S. 发布。
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);
对于 Firefox 34(已经支持 ECMAScript6 String.repeat),本机重复是最快的,其次是 strRepeat。
有趣的是,在我的测试运行中,与 Firefox 的原生 String.repeat 函数相比,Chrom(e|ium) 39 的 strRepeat 函数更快。
对于所有测试的浏览器,Paul S. 使用原生 Array.join 方法提出的函数比 underscore.string 库的 strRepeat 函数慢。因此,如果您正在寻找一种快速的方法,请不要使用它。
您可以创建一个任意长度的数组,然后使用join()
数组上的方法将其变成一个字符串。Array(number).join(char)
这会在 size 上创建一个数组number -1
。另请注意,您不想使用您的方法,因为连接字符串非常昂贵(每个连接 O(n))。我不确定 javascript 是否有类似 java 的 StringBuilder