vue 源码中为什么这么写 这个repeat 函数?
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这样写可以把循环次数从 n 次优化到 log2(n) 次。
把 n 写成二进制形式,从低位到高位遍历,每移动一位意味着基数翻一倍,这一位为0意味着不计入结果,为1意味着计入结果。
比如要循环字符 “abc” 11 次,11 写成二进制:1011
基数对应字符串刚好是上一次的翻倍,这就是
if (n > 1) { str += str; }
的意思。因为 11 = 1 + 2 + 8,所以循环 11 次的字符串就等于列对应的底下的字符串相加。