JavaScript内部默认情况下,二进制、十六进制、八进制字面量值会自动转换为十进制进行计算。0x22//340b111//70o33//270x22+0b111//410o33+12//39(0x33).toString()//51(0x33).valueOf()//51除了十进制是Javascript的默认数字基数,其他三个基本方法很少用到,主要是在处理底层数据,字节编码或者位操作的时候遇到。十六进制转换本文将主要讨论十六进制转换中的问题。JavaScript提供了在十进制和其他基数之间进行转换的本机函数。其中,其他基数转十进制的方式有3种:parseInt()、Number()、+(一元运算符)。这三种方法都只能转换整数。要从十进制转换为其他基数,您可以使用Number.prototype.toString()。支持小数。parseInt(str,radix)第一个参数是要解析的字符串;其他基地没有前缀。第二个参数是一个基数,表示在转换过程中使用什么基系统来理解字符串。默认值为10,表示转换为十进制。如果第二个参数不是数字,它会自动转换为数字。如果不能转换为数字,该参数将被忽略;如果是数字,则必须是2-36的整数。如果超出这个范围,则返回NaN。parseInt('1111',2)//15parseInt('1234',8)//668parseInt('18af',16)//6319parseInt('1111')//1111如果没有传入第二个参数,parseInt将Strings默认以十进制解析;但是,如果字符串以0x开头,则将其视为十六进制数。而其他base的字符串,0o21(八进制),0b11(二进制)不会自动与base的base进行转换,而是得到0。因此,在使用parseInt进行二进制转换时,为了保证正确性和稳定性运行结果,第二个参数不能省略。parseInt('0x21')//33parseInt('0o21')//0parseInt('0b11')//0parseInt('111','add')//111parseInt('111','787')//NaN如果如果待解析的字符串中有当前base无效的字符,则有效字符从最高位开始转换,没有有效字符则返回NaN。parseInt('88kk',16)//136,===0x88parseInt('kk',16)//NaNNumber()可以将字符串转为数字,支持其他基数的字符串,默认转为十进制数。如果字符串中存在无效的基本字符,则返回NaN。请记住,您需要使用基本前缀0b、0o、0x。Number('0b11100')//28Number('0o33')//27Number('0x33')//51Number('0x88kk')//NaN+(一元运算符)和Number()一样,可以转换字符串toNumbers,支持其他基数的字符串,默认转为十进制数。如果字符串中存在无效的基本字符,则返回NaN。还需要一个基本前缀。+'0b11100'//28+'0o33'//27+'0x33'//51+'0x88kk'//NaN可以看出,它和Number()基本一样,本质上都是一对数A转换过程。Number.prototype.toString(radix)支持传入一个基数,用于将数字转换成基数对应的字符串,支持转换小数。如果不指定默认值为10,radix参数的取值范围为2-36,超出范围会报错:RangeError。15..toString(2)//1111585..toString(8)//11114369..toString(16)//1111(11.25).toString(2)//1011.01除了这些原生函数,自定义转换也是可以自己实现基数之间的转换函数。根据相应的规则,可以实现一些十进制、二进制和十六进制之间的转换方法。十进制和十六进制的转换下面的代码是整数在十进制和十六进制之间的转换,转换是按基本规则进行的。十六进制是描述数字0-9、a-f的一种方式,其中0-9取其自身的值,a-f取10-15的值。字母不区分大小写。functionint2Hex(num=0){if(num===0){return'0'}constHEXS='0123456789abcdef'lethexwhile(num){hex=HEXS.charAt(num%16)+hexnum=Math.floor(num/16)}returnhex}functionhex2Int(hex=''){if(typeofhex!=='string'||hex===''){returnNaN}consthexs=[...hex.toLowerCase()]letresInt=0for(leti=0;i
