# 十进制与二进制转换

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步执行:

  1. parseInt(1, 0) 返回 1
  2. parseInt(2, 1) 返回 NaN
  3. parseInt(3, 2) 返回 NaN

所以,最终结果为:[1, NaN, NaN]