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看的很透彻之时,我们就可以通过它们去定义一些自己的工具类,来处理日常中所遇到的问题。