这两天Npm leftpad的新闻真是挺火的,详情点这里了解,来龙去脉就不讲了,跟本文也没有太大的关系。这篇文章主要想说一说我们很少用到的位操作符,然而位操作符跟这件事情有什么关系呢?
这要从leftpad的用处说起。leftpad这个模块起一个很简单的作用,从左边补位。看示例代码
leftpad('foo', 5)
// => " foo"
leftpad('foobar', 6)
// => "foobar"
leftpad(1, 2, 0)
// => "01"
参数说明
第一个参数是字符串,
第二个参数是字符串的长度,
第三个参数是补位的字符串默认是空字符串。
实现
function leftpad(str,len,ch){
if(!ch && ch!==0){
ch = ' '
}
var count = len - str.length;
if(count<0) return str;
var rpt = '';
for(;;){
//count为奇数的时候执行,其实只要count为1执行就可以了,这样写我认为是为了速度更快
if(count & 1) rpt += ch ;
//无符号右移。代码的core所在
count >>>= 1;
if(count == 0) break;
ch += ch
}
return rpt + str;
}
注意for循环里面的代码。因为位操作符是比较少用,正好复习一下。
for循环里并不关心count的值是几,而是每次循环按位向右移动,只要判断值是否等于0,也就是右移到边界(二进制里面所有的1都移走了)。
按位操作符为什么比较快,因为位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
tips
按位操作可以参考MDN上的文档)