Skip to content

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 => 47859

0123 如果一个数字以零开始,浏览器会默认认为其是八进制,但是浏览器也会直接把八进制转换为 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
*/