# 十进制与二进制转换
js
内置了十进制与二进制转换的函数,很方便。
十进制转成二进制使用toString
:
(100).toString(2); // 1100100
二进制转成十进制则使用parseInt
:
parseInt('1100100'); // 100
# 十进制转成二进制的实现
突然想到这个问题,其实是相当基础的,不过知识都还给老师了,温习一下:
function trans(num, radix = 2) {
var arr = [];
while (num) {
let remainder = num % radix;
arr.unshift(remainder);
num = Math.floor(num / radix);
}
return arr.join('');
};
就是进行除法,取得的余数放在最后,倒着来即可。几进制都一样。
# parseInt补遗
['1','2','3'].map(parseInt)
上面代码的运行结果是什么?好些人答不上来,原因在于对parseInt
的参数掌握不够。
平时我们使用parseInt
时,基本上是这样:parseInt('1')
,很少会关注第二个参数。就像我们多数情况下不会使用forEach
的第二个参数一样。
对于parseInt(s, radix)
,功能是解析一个字符串并返回指定基数的十进制整数
,或者NaN
。我们看下这两个参数:
- s, 十进制表示的字符串
- radix,指定的基数,是2-36之间的整数
比如以下例子都返回15:
parseInt("0xF", 16);
parseInt("F", 16);
parseInt("17", 8);
parseInt(021, 8);
parseInt("015", 10); // parseInt(015, 10); 返回 13
parseInt(15.99, 10);
parseInt("15,123", 10);
parseInt("FXX123", 16);
parseInt("1111", 2);
parseInt("15 * 3", 10);
parseInt("15e2", 10);
parseInt("15px", 10);
parseInt("12", 13);
以下例子都返回NaN
:
parseInt("Hello", 8); // 根本就不是数值
parseInt("546", 2); // 除了“0、1”外,其它数字都不是有效二进制数字
parseInt("546", 3); //与上同理,如果是三进制,肯定只能是“0、1、2”这3个数字之一
回到题目本身,它其实相当于下面的代码:
['1','2','3'].map(function(item, index) {
return parseInt(item, index);
})
相应地,也就是下面3步执行:
parseInt(1, 0)
返回 1parseInt(2, 1)
返回NaN
parseInt(3, 2)
返回NaN
所以,最终结果为:[1, NaN, NaN]
。