把其它的数据类型转换为number类型的深入理解

显式转换方案:

  • Number([val]) -> 隐式转换一般调取的都是这个方法 「浏览器有自己的特殊处理,针对于每一种情况都有详细的规则」
  • parsetInt/parseFloat([val])
    • parsetInt([val],[radix])处理机制
      • [val] 必须是一个字符串,如果不是,则也要默认转换为字符串
      • [radix]不设置(或者写的是零):正常都是按照 10 处理的,如果字符串是以”0x“开始的,默认值是 16...
    • 先在[val]中,找到所有符合[radix]进制的内容(从左到右查找,直到遇到不符合的为止「不论后面是否还有符合进制的,都不在查找了」),然后再把找到的内容看做[radix]进制,转换为十进制
    • [radix]范围 2~36,除了 0 以外(0->10/16),不在这个范围内,结果都是 NaN

例如:parseInt('12px') -> parseInt('12px',10)
->在字符串中找到所有符合10进制的内容 ‘12’ -> 最后把'12'当做看做10进制,转换为10进制 -> 12
parseInt('12px',1) -> NaN

怎么换算把其它进制转换为10进制?那就是从右到左,每一位的值乘以进制的当前值位权幂
例如:'10101' 2机制 -> 10进制
12^0 + 02^1 + 12^2 + 02^3 + 1*2^4 = 1+2+4+8+16 = 21

long long ago的面试题

let arr = [27.2, 0, '0013', '14px', 123]
arr = arr.map(parseInt)
console.log(arr) // [27,NaN,1,1,27]
/* 解题思路
第1次循环传值parseInt(27.2,0)  先转字符串'27.2',第二位不写或者是0默认都是按照10进制进行运算,27
第2次循环传值parseInt(0,1)  没有1进制,NaN
第3次循环传值parseInt('0013',2) 2进制转10进制,找到'01'符合2进制,1*2^0+0*2^1+0*2^2 = 1
第4次循环传值parseInt('14px',3) 3进制转10进制,找到'1'符合3进制,1*3^0 = 1
第5次循环传值parseInt(123,4) 先转字符串'123',4进制转10进制,找到'123'符合4进制,3*4^0 + 2*4^1 + 1*4^2 = 27
*/
上一篇:js rgb hex hsv色值转换


下一篇:【华为机试题】整数与IP地址间的转换和蛇形矩阵