03 parseInt 详细剖析和进制转换
parseInt([value])剖析
js
先把[value]转换为字符串,再从字符串左侧开始查找所有的有效数字字符「遇到一个非有效数字字符则结束查找,不论后面是否还有」,把找到的有效数字字符转换为数字,一个都没找到,结果就是NaN
parseInt([string],[radix]):[radix]是进制,有效取值范围2~36之间,如果不传递默认是10进制「但是如果字符串是以“0x”开始的,默认是16进制」;如果写零,和不写是一样的规则;
把[string]看做[radix]进制「从左侧找到所有符合这个进制的字符,遇到不符合的结束查找」,把找到的字符转换为数字「10进制」;
如果[radix]不在2~36之间「排除0」,则返回的是NaN扫盲 1:
js
2进制 0~1
8进制 0~7
10进制 0~9
16进制 0~9 A~F扫盲 2:
js
let str = '12345.23'; //->八进制
3*8^-2 + 2*8^-1 + 5*8^0 + 4*8^1 + 3*8^2 + 2*8^3 + 1*8^4 -> 十进制的值
8^0 -> 1
8^-1 -> 1/8 倒数
3*(1/64) + 2*(1/8) + 5*1 + 4*8 + 3*64 + 2*512 + 1*4096 =>5349.296875
parseInt('0x0BAF3') -> parseInt('0x0BAF3',16)
0BAF3 16->10
3*16^0 + 15*16^1 + 10*16^2 + 11*16^3 + 0*16^4
3 + 15*16 + 10*256 + 11*4096 + 0 => 478590123 如果一个数字以零开始,浏览器会默认认为其是八进制,但是浏览器也会直接把八进制转换为 10 进制
浏览器会把「已 0 开头的数字」识别为八进制,parseInt 不会。parseInt 会把 「已 0x 开头的数字」识别为 16 进制
练习
js
let arr = [27.2, 0, '0013', '14px', 123]
arr = arr.map(parseInt)
console.log(arr)
/*
arr = arr.map((item, index) => {
+ 数组有多少项遍历对少次,回调函数执行多少次
+ item->当前项 index->当前项索引
+ 回调函数的返回值会替换数组中当前项的结果「原始数组不变,以新数组形式返回」
return 'xxx';
});
parseInt('27.2',0) -> 27
parseInt('0',1) ->NaN
parseInt('0013',2) ->'001'当做2进制转换为10进制 1*2^0 + 0*2^1 + 0*2^2 ->1
parseInt('14px',3) -> '1'当做3进制转换为10进制 1*3^0 -> 1
parseInt('123',4) -> '123'当做4进制转换为10进制 3*4^0 + 2*4^1 + 1*4^2 -> 27
*/