left-pad和按位操作符

这两天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上的文档)