工作中遇到的一些javaScript细节(一)

js中的进制转换

用toString()进行进制转换

1.这里我们不介绍toString的用法了,直接上代码

    var str = 16;
    console.log(str.toString());
    //'16'

xxx.toString();默认无参数时,字符串转换,把xxx转换成字符串;略…….

2.用toString()实现进制转换,我们将16转换成2进制数。在参数中传入你想转换成的进制数,我们来看代码

    var str = 16;
    str = str.toString(2);
    console.log(str);
    //'10000'

这里需要注意,转换出来的2进制是字符串形式,直接用数字去调这个原生js方法会报错

    console.info(16.toString());
    //Invalid or unexpected token

至于为什么,去看看犀牛书吧,今天重点不在这里。(你可以试试下面这段代码)

    (16).toString(2);
    16..toString(2);
    16  .toString(2);

提醒:注意js的解析模式,toFixed()等也有相同问题,自己琢磨吧。

3.toString()很好用,为什么呢?他可以做到typeof 所做不到的事,它可以判断js中所有数据类型,上代码。
我们先看看,toString的原型。

    toString instanceof String;
    //false
    toString instanceof Function;
    //true
    toString instanceof Object;
    //true
    Function instanceof Object;
    //true
    Object instanceof Function;
    //true

我们看到Object和Function是相互的,里面渗入了js中很磨人的原型问题,在之后的博客中我会写到对此的了解。现在我们先看toString(),判断一个变量是不是Array。

  Object.prototype.toString.call([]);
  //[Object Array];

当我们了解了这一特性,我们就可以在我们的js工具中来新增判断变量数据类型的方法。

//申明一个工具对象
var sf = {};
"String,Number,Date,Error,Array,RegExp,Math,Boolean,Object,Function,Null,Undefined".replace(/\w+/g,function(i){
       sf["is"+i]=function(n){
           return {}.toString.call(n)==="[object "+i+"]"
       }
    });
sf.isNull(undefined);
//false

这里我们就可以发现js的一些坑人之处,先上代码

    Object.prototype.toString.call([]);
    //"[object Array]";
    {}.prototype.toString.call([]);
    //Uncaught SyntaxError: Unexpected identifier
    function jude(n){
        return {}.toString.call(n);
    }
    jude([]);
    //"[object Array]"

从上述代码中我们可以看到,当我们直接用数据类型去调toString时,js是会报错的,但是当我们用一个function去接住它,return出去,在调用,其实发现是可以调用的。至于为什么,在试试下面代码。(其实跟上面数字调用toString的原因一样)

    ({}).toString.call('');
    new Object().toString.call('');
    var obj = {};
    obj.toString.call(function(){});

当我们知道了toString()能将10进制数转成其他进制数时,我们有没有想过怎么把它转回来?

巧用parseInt()

用parseInt()可以把它转回来。举一个例子,255的16进制是’ff’,我们看下用js它们之间是怎么转换的。

    (255).toString(16);
    //'ff'
    parseInt('ff',16);
    //255

在原生js中parseInt()是取整的意思,但是它也有一些其他的可用之处,比如若接收到一个后台的2进制数,我们需要把其转换成整数展示给用户,我们就可以巧用parseInt()。通常我们都传入一个参数,忽略了它的第二参数,其实第二参数它默认是10,意思也就是说js将把第一个需转换的参数,看作是后面参数的进制,将其转换成整数,也就是10进制。比如

  • parseInt(‘ff’) 忽略第二参数,默认是10,解析意思:将’ff’这个10进制转换成整数,结果必然 NaN
  • parseInt(‘ff’,16) 第二参数16,解析意思:将’ff’这个16进制转换成整数,结果255
  • parseInt(‘10000’,2) 第二参数2,解析意思:将’10000’这个2进制转换成整数,结果16

当我们知道了parseInt()这一特性。我们就可以在一些场景下运用到toString和parseInt之间的相互转换。

parseInt兼容性问题

    parseInt('09')
    //9

在chrome控制台中,我们看到parseInt(‘09’)被格式化取整为9,但是我们在试试IE8,发现它格式化取整为0,这是为什么?因为在IE下,’09’默认是8进制的标识,所以在IE下默认将它作为8进制去格式化取整了,所以会得到0,我们试着在chrome中试验一下。

    parseInt('09',8)
    //0

发现和IE8中parseInt(‘09’)是一样的结果。所以通过对parseInt()的研究,我们发现在用parseInt()格式化取整数字的时候,为了避免兼容性问题我们最好加上后面第二个参数

    parseInt('09',10)
    //9

~~

    ~~232323.34343;
    //232323

我们可能会看见过~~格式化取整数字的方法,但是需要注意的是在一些场景下会有问题,比如

    ~~2147483648;
    //-2147483648

发现格式化的时候,变成负数了。

当我们了解到js的一些原生知识,将toString()、parseInt()或者其他js原生API看的很透彻之时,我们就可以通过它们去定义一些自己的工具类,来处理日常中所遇到的问题。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值