显式转换方案:
-
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
*/