【问题标题】:How to create a string with n characters? How to create a string with specific length? [duplicate]如何创建一个包含 n 个字符的字符串?如何创建具有特定长度的字符串? [复制]
【发布时间】:2013-06-02 17:21:01
【问题描述】:

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

目前我正在使用:

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

【问题讨论】:

    标签: javascript string


    【解决方案1】:

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

    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 &lt; 0,则抛出 RangeError 异常。
    7. 如果n+Infinity,则抛出 RangeError 异常。
    8. T 成为一个String 值,该值是由n 的副本组成的S 附加在一起。如果n0,则T 是空字符串。
    9. 返回T

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

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

    【讨论】:

    • 2015 年更新:ECMAScript 2015 已经定稿,并且在其中,因此使用起来绝对安全。它目前在 Chrome 和 Firefox 中受支持,而不是 IE 或 Safari。 MDN 有一个 polyfill 可用。
    【解决方案2】:

    怎么样

    Array(65537).join('x')
    

    请注意,它是 65537,而不是 65536,因为您将字符放在中间。

    【讨论】:

    • 根据您的注释使其直观:Array(65535 + 2).join('x')
    • join 对于大字符串来说比 repeat 慢得多
    【解决方案3】:

    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"
    

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

    【讨论】:

    • 我喜欢! Array.prototype.join.call({length: 65537}, 'x');
    【解决方案4】:

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

    http://jsperf.com/mkstring

    参赛者是

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

    【讨论】:

    • 不要引用链接,只需复制粘贴其中有趣的部分。
    • 好的,我已经更新了我的答案以及 jsperf 测试,以避免缺少 String.repeat 函数的浏览器出错。
    • 我不太确定这个答案应该做什么。如果您指的是帖子或网站,请记住他们在此处的建议:“虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。仅链接的答案如果链接页面发生变化,可能会失效。”
    • @fedorqui 最初的问题是解决问题的最佳方法是什么。在这种情况下,它可能意味着最快的方式是什么。你只能通过比较才能发现。我提供了 jsperf 测试的链接,因为这是进行此类比较的唯一合理做法,因为结果会因您的操作系统、系统、浏览器和 CPU/内存负载而异。
    • 这是一个非常公平的观点。我相信链接的经验法则是:如果链接断开怎么办,仅凭答案就足够了吗?我认为是这种情况,因此我赞成这个答案并欢迎您加入社区。​​span>
    【解决方案5】:

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

    【讨论】:

    • 澄清一下Array(number).join(char) 将创建一个包含number - 1 元素的数组。
    猜你喜欢
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2012-12-30
    • 2014-06-27
    相关资源
    最近更新 更多