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,因为你把字符放在中间.
小智 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)
采取以下步骤:
- 我们
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:此方法创建一个String,该字符串由此对象的字符串元素(转换为String)重复计数时间组成.
注2:重复功能是故意通用的; 它不要求它的这个值是一个String对象.因此,它可以转移到其他类型的对象以用作方法.
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)
这使您可以从制作字符串的本机函数中受益,而无需大量数组的开销.
出于兴趣,我在 jsperf.com 上创建了一个快速基准测试:
参赛者是
数组(x).join()
Array.prototype.join 由 Paul S 发布。
来自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)
对于 Firefox 34(已经支持 ECMAScript6 String.repeat),原生重复是最快的,其次是 strRepeat。
有趣的是,在我的测试运行中,与 Firefox 的原生 String.repeat 函数相比,Chrom(e|ium) 39 的 strRepeat 函数甚至更快。
对于所有经过测试的浏览器,Paul S. 提出的使用原生 Array.join 方法的函数比 underscore.string 库的 strRepeat 函数慢。因此,如果您正在寻找快速方法,请不要使用它。