把其它的数据类型转换为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进制 1x2^0 + 0x2^1 + 1x2^2 + 0x2^3 + 1x2^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
*/

//这个面试题考的就是类型隐式转换
let result = 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
console.log(result);  //100+1+21.2+0+NaN+'Tencent'+""+null+9+fasle =>'NaNTencentnull9false'
posted @ 2020-12-07 16:31  guyigg  阅读(197)  评论(0)    收藏  举报