我正在编写JavaScript单元测试,我需要创建一个长度为65536的字符串。 在JavaScript中执行此操作的最佳方法是什么?
目前我正在使用:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
答案 0 :(得分:34)
怎么样
Array(65537).join('x')
注意,它是65537,而不是65536,因为你把字符放在中间。
答案 1 :(得分:27)
这是一个前瞻性的答案,并不适用于当前的实施。
ECMAScript 6目前正在定义String.prototype.repeat
方法。这将允许您:
var result = "x".repeat(65535);
同样,这是未来的补充。目前正在起草ECMAScript 6(Harmony),这在技术上可以删除,但似乎不太可能。
目前的草案:
15.5.4.21 String.prototype.repeat(count)
采取以下步骤:
- 让
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}}。
醇>注1:此方法创建一个由重复此对象(转换为String)的字符串元素组成的String 算上时间。
注2:重复功能是有意通用的;它不要求它的这个值是一个String对象。因此,它可以转移到其他类型的对象以用作方法。
答案 2 :(得分:8)
Array.prototype.join
,只需使用长度属性调用对象(在谷歌Chrome,FireFox,IE10)
function makeStr(len, char) {
return Array.prototype.join.call({length: (len || -1) + 1}, char || 'x');
}
makeStr(5); // "xxxxx"
这使您可以从制作字符串的本机函数中受益,而无需大量数组的开销。
答案 3 :(得分:4)
出于兴趣,我在jsperf.com上创建了一个快速基准测试:
参赛者
数组(x).join()
由Paul S发布的Array.prototype.join。
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);
&#13;
对于Firefox 34(已经支持ECMAScript6 String.repeat),原生重复最快,然后是strRepeat。
有趣的是,对于Chrom(e | ium)39,与我在测试运行中的Firefox的原生String.repeat函数相比,strRepeat函数更快。
对于所有经过测试的浏览器,Paul S.使用本机Array.join方法提出的函数比underscore.string库的strRepeat函数慢。因此,如果您正在寻找快速方法,请不要使用它。
答案 4 :(得分:0)
您可以根据需要创建一个长度数组,然后在数组上使用join()
方法将其转换为字符串。 Array(number).join(char)
这会创建一个大小为number -1
的数组。另请注意,您不希望使用您的方法,因为连接字符串非常昂贵(O(n)每个concat)。我不确定javascript是否有类似java的StringBuilder