【发布时间】:2013-06-02 17:21:01
【问题描述】:
我正在编写 JavaScript 单元测试,我需要创建一个长度为 65536 的字符串。 在 JavaScript 中执行此操作的最佳方法是什么?
目前我正在使用:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
【问题讨论】:
标签: javascript string
我正在编写 JavaScript 单元测试,我需要创建一个长度为 65536 的字符串。 在 JavaScript 中执行此操作的最佳方法是什么?
目前我正在使用:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
【问题讨论】:
标签: javascript string
这是一个前瞻性的答案,在当前的实现中不起作用。
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 重复函数是故意通用的;它不需要它的this值是String对象。因此,它可以转移到其他类型的对象中作为方法使用。
【讨论】:
怎么样
Array(65537).join('x')
请注意,它是 65537,而不是 65536,因为您将字符放在中间。
【讨论】:
join 对于大字符串来说比 repeat 慢得多
Array.prototype.join 不必在 Array 上调用,只需在具有 length 属性的 Object 上调用(在 Google Chrome 中测试, 火狐, IE10)
function makeStr(len, char) {
return Array.prototype.join.call({length: (len || -1) + 1}, char || 'x');
}
makeStr(5); // "xxxxx"
这使您可以从创建字符串的本机函数中受益,而无需庞大数组的开销。
【讨论】:
出于兴趣,我在 jsperf.com 上创建了一个快速基准测试:
参赛者是
Array(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) 这会创建一个大小为 number -1 的数组。另请注意,您不想使用您的方法,因为连接字符串非常昂贵(每个连接 O(n))。我不确定javascript是否有类似java的StringBuilder
【讨论】:
Array(number).join(char) 将创建一个包含number - 1 元素的数组。