vue 源码中为什么这么写 这个repeat 函数?

发布于 2022-09-12 04:21:51 字数 215 浏览 18 评论 0

  var repeat = function (str, n) {
    var res = '';
    while (n) {
      if (n % 2 === 1) { res += str; }
      if (n > 1) { str += str; }
      n >>= 1;
    }
    return res
  };

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

是你 2022-09-19 04:21:51

这样写可以把循环次数从 n 次优化到 log2(n) 次。

把 n 写成二进制形式,从低位到高位遍历,每移动一位意味着基数翻一倍,这一位为0意味着不计入结果,为1意味着计入结果。

  var repeat = function (str, n) {
    // 结果存放的地方
    var res = '';
    while (n) { // n 没到达 0 则循环
      
      //当前位是0是1? 是 1 的话计入结果,str 是当前位的基数
      if (n % 2 === 1) { res += str; }
      
      //还有下一位吗?有的话 str 翻倍即为下一位的基数 
      if (n > 1) { str += str; }
      
      //移动到下一位
      n >>= 1;
    }
    return res
  };

比如要循环字符 “abc” 11 次,11 写成二进制:1011

二进制位1011
基数8421
基数对应字符串abcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

基数对应字符串刚好是上一次的翻倍,这就是 if (n > 1) { str += str; } 的意思。因为 11 = 1 + 2 + 8,所以循环 11 次的字符串就等于列对应的底下的字符串相加。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文