前语

parseInt(string, radix):用于解析一个字符串并回来指定基数的十进制整数。 parseInt(string, radix): 将一个字符串string转化为radix进制的整数,radix为介于2-36之间的数。究竟都是以十进制办法回来。

parseInt规矩

  • 将一个字符串string转化为radix进制的整数,radix为介于2-36之间的数。究竟都是以十进制办法回来。
  • 函数将其榜首个参数转化为一个字符串,对该字符串进行解析,然后回来一个整数或NaN
  • 假定radix没有指定或者是0,则会被指定为10进制来解析
  • 假定string0x 0X开端,则指定为16进制来解析。
  • 榜首个字符不能转化为数字,parseInt会回来NaN

1、string参数假定不是字符串

MDNparseInt 语法的说明: parseInt 办法接收两个参数待解析值 string,基数 radixstring 参数假定不是字符串,则会调用其 toString 办法转化为字符串。因而遇到非字符串解析值,parseInt 内部会有两部操作:

Step1: 调用 toString 办法

(0.5).toString(); //  '0.5'
(0.05).toString(); //  '0.05'
(0.005).toString(); //  '0.005'
(0.0005).toString(); //  '0.0005'
(0.00005).toString(); //  '0.00005'
(0.000005).toString(); //  '0.000005'
(0.0000005).toString(); //  '5e-7'

留神上面的输出,咱们能够发现当数字过小时,toString输出的作用是科学计数法办法。

Step2: 堵截操作

引证一段来自StackOverflow的说明:
parseInt 只能将字符串的前导部分说明为整数值;它疏忽任何不能被说明为整数的代码单元,而且不会有疏忽指示。

因而答案只会回来5,其他的e-7被疏忽。

留神事项:

假定即将解析的值放入字符串中,那么上面这种惊喜就不会呈现了:

parseInt("0.0000005"); // 0
parseInt("0.000000005"); // 0

2、radix 值为 undefined、0 或未指定的

radix 值为 undefined、0 或未指定的,那 JavaScript 会怎样处理这种情况:

  • 假定输入的 string0x0X 开端,那么 radix 会被假定为 16 ,字符串的其他部分按照十六进制来解析。
  • 假定输入的 string0 开端,ES5 规矩运用十进制,但并非悉数的浏览器都支撑,因而运用 parseInt 时,需要指定 radix
  • 假定输入的 string 以其他任何值开端,radix 值为 10
parseInt("0x16"); // 22
parseInt("0888"); // 888
parseInt("123px"); // 123

3、radix 值小于 2 或 大于 36

radix参数的值为2 ~ 36,当radix小于2或 大于36(不包括0),回来值为NaN

parseInt("123px", 1); // NaN
parseInt("123px", 38); // NaN
parseInt("123px", -1); // NaN

4、待转化字符串中,悉数的可转化数字都不小于 radix 值

回来值为NaN

parseInt("3456", 2); // NaN
parseInt("45px", 3); // NaN

5、string有必要小于第二个参数radix吗?

parseInt的榜首个参数string的的实数有必要小于进制数?

['1', '2', '3'].map(parseInt)输出什么

  • 前两个解析正常,为什么第三个parseInt('125', 5)输出为7,这就不符合上面的核算公式,后来发现它自动把究竟的5给删去了,输出的其实是parseInt('12', 5),这样输出便是等于7
  • 为什么第四个输出是NaN,由于参数string5开端,不符合进制所属数,所以直接回来NaN
  • 究竟一个直接把55删去了,究竟解析成parseInt('1', 5),输出1

定论:

  • 假定榜首个参数string的榜首个值就大于等于第二个参数radix,那么直接回来NaN
  • 假定榜首个参数string的榜首个值符合条件,其他值不符合条件,那么不符合条件的值到究竟会被疏忽,然后进行核算

6、parseInt容许前导和后置空格

parseInt容许前导和后置空格,在进行转化前,会首要删去字符串的前导和后置空格。

// 容许前导和后置空格
parseInt("  123 "); // 123
// 中心呈现的空格会被作为堵截符
parseInt("123 456 "); // 123

7、parseInt能够了解正负号

parseInt("+123"); // 123
parseInt("-123"); // -123
// 只能了解榜首个正负号,第二个非数字字符,因而回来 NaN
parseInt("+-123"); // NaN

运算

parseInt('123',5)

留神:此处千万不要把1*5^2 + 2*5^1 + 3*5^0直接复制下来在控制台运算,否则核算出来的跟实践parseInt('123', 5)算出来的作用不一样,至于为什么,由于是位运算符,其实在这表达的意思是几次方的意思,正确写法:1*Math.pow(5, 2) + 2*Math.pow(5, 1) + 3*Math.pow(5, 0)

标题一:['1', '2', '3'].map(parseInt)

先看看其他比方:

['1', '2', '3'].map(Number)
// [1, 2, 3]

所以,['1', '2', '3'].map(parseInt)完好写法是:

['1', '2', '3'].map((v, i, arr) => parseInt(v, i))

map():里面是个回调函数,三个参数:分别是当时值(v),下标(i),原始数组(arr)

实施次序:['1', '2', '3'].map((v, i, arr) => parseInt(v, i)),顺次输出:

  • parseInt('1', 0),radix为0,按十进制解析,所以输出 1
  • parseInt('2', 1),radix是2-36之间,没有1,所以输出 NaN
  • parseInt('3', 2),radix是2,则榜首个参数只能是0,1,所以输出 NaN

扩展:

['1', '2', '3'].map(parseInt)输出什么

  • 数组'3',...'9'之间对应的下标值便是2~8,榜首个参数都大于进制,所以都是NaN

标题二:['10', '10', '10', '10'].map(parseInt)

['10', '10', '10', '10'].map(parseInt)完好写法是:

['10', '10', '10', '10'].map((v, i, arr) => parseInt(v, i))

顺次输出:

  • parseInt('10', 0),radix为0,按十进制解析,所以输出 10
  • parseInt('10', 1),radix是2-36之间,没有1,所以输出 NaN
  • parseInt('10', 2),radix是2,输出1*Math.pow(2, 1) + 0*Math.pow(2, 0),悉数输出2
  • parseInt('10', 3),radix是3,输出1*Math.pow(3, 1) + 0*Math.pow(3, 0),悉数输出3

标题三:parseInt(0.0000005)

parseInt (0.0000005) === 5true吗?答案是肯定的。

标题四: ['1', '7', '11'].map(parseInt)

首要,parseInt 接受两个参数,因而第三个参数会被疏忽。

榜首次实施, parseInt('1', 0) 会输出 1 ,由于 0 会转化成 false,而 false 会使它实施默许的进制 10 ,便是 parseInt 默许都是转化十进制;

第2次实施,parseInt('7', 1) 由于没有所谓的 1 进制,所以无法转化,输出 NaN

第三次实施parseInt('11', 2) 答案为 3 ,由于以 2 为进制转化,3 的二进制是 11。

所以究竟的输出的作用便是 [1, NaN, 3]


文章摘抄:

  • 深化了解parseInt
  • 你不知道的 parseInt