平常对parseInt的使用仅限于用它来转换字符数字,直到今天对它有了新的认识。
首先parseInt的语法是:
parseInt(string, radix) parseInt() 函数可解析一个字符串,并返回一个整数。
参数 | 描述 |
---|---|
stringf | 必需。要被解析的字符串。 |
radix |
可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。 |
看了这个参数描述还是懵懵懵;通过不断查资料,加上自己又动手多尝试各种情况,终于搞明白了。
1、console.log(parseInt(3,0))//第一个参数表示需要被解析的;第二个参数表示要解析的数字基数为0,这里浏览器看到0就认为是以十进制解析,计算过程:3*10^0 = 3*1=3;
2、console.log(parseInt(4,5))//第一个参数表示需要被解析的;第二个参数表示要解析的数字基数为5,计算过程:4*5^0=4*1=4;
3、console.log(parseInt(4,1))//根据第二个参数的值介于 2 ~ 36 之间,第二个参数为1不在2~36内,所以返回NaN;
4、console.log(parseInt(42,5))//第二个参数5表示五进制(0,1,2,3,4,5),字符是一个一个解析的,先解析4,在五进制中可以找到4,再解析2,也能在五进制中找到,所以计算过程:4*5^1+2*5^0=4*5+2*1=22;
5、console.log(parseInt(48,5))//字符是一个一个解析的,第一个4小于基数5能解析出来,第二个8大于基数不能被解析,所以只把4取出来并返回,计算过程:4*5^0=4*1=4;
6、console.log(parseInt(482,5))//跟4的结果一样,虽然8后面还有小于基数的数,但是字符在一个个解析的时候遇到大于基数的数一看不认识就立马跳了出来,直接返回前面解析成功的字符4,不管后面还有没有了,所以结果也为4*5^0=4。
7、console.log(parseInt(8,2))//这个情况跟5类似,解析第一个字符就碰壁(2进制里只含有(0,1),不包含8),一看不认识就立马跳出来了,就返回NaN;
8、console.log(parseInt(false,16)) //这个第一个参数是字符串'false',而不是布尔型;第二个参数表示十六进制(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f),解析false时第1个字符时是'f',它在十六进制中存在,再解析第2个字符为'a'
十六进制也认识,但解析到第3个字符'l'时,十六进制不能识别它,所以就立马停止解析,返回解析过的'fa',‘fa’在十六进制中对应十进制中的250;所以结果为250;
9、console.log(parseInt('0x10'))//这个只有一个参数,默认采用十进制进行解析(0,1,2,3,4,5,6,7,8,9),'0x'是十六进制的写法,所以十六进制的10转为十进制等于16;
10、console.log(parseInt(‘011’))//只有一个参数默认采用十进制解析,则返回结果为11
11、console.log(parseInt(011))//参数以0开头,但后面不是字符串,需要先将数值转为字符串,再进行解析,采用八进制进行解析,返回结果为1*8^1+1*8^0=9;
12、console.log(parseInt(0.0000008))//这个是科学计数法的转换,parseInt会将科学计数法的表示方法视为字符串;等同于parseInt('8e-7'),默认是10进制,不能解析第二个字符e,所以结果为8;
13、console.log(parseInt(“0.0000008”))//这个结果为0,因为这个是一个字符串,第一个字符为0,第二个字符不能识别立即跳出,所以结果为0;
那么,接下来就谈谈console.log(["1", "2", "3"].map(parseInt))问题结果是什么!
["1", "2", "3"].map(parseInt)实际是["1", "2", "3"].map(function(value,index){
returm parseInt(value,index);
})
那么情况就是这样的(相当于调用了三次parseInt()):
1、第一次调用:parseInt(‘1’,0)//基数为0也就是按十进制转换,所以结果为1;
2、第二次调用:parseInt('2',1)//基数为1,它不在2~36内,所以返回NaN;
3、第三次调用:parseInt('3',2)//基数为2(0,1),但是第一格参数为3大于基数,在解析的时候不认识3,所以也返回NaN
所以最终的结果为:[1,NaN,NaN];
综合上述学习,相信你应该很快说成console.log(["023", "11", "115",“abc”,0.0000002,"0.0001","51"].map(parseInt))的答案了吧~
答案是:[23,NaN,3,NaN,2,0,NaN]
来个总结吧: 1、parseInt中第二个参数 radix 是介于2-36的数, 计算机中 0到9为十进制,再往上十一进制开始用字母表示那么26个字母就可以再十进制上面加多26个进制,即三十六进制。
2、如果parseInt中的参数不是字符串,那么会先转成字符串再进行转换;
3、字符串转整数的时候是一个一个字符依次进行转换的,一旦遇到不能转为数字的字符,就不会再进行下去,直接返回已经转好的部分;
4、如果字符串的第一个字符不能转为数字时,则直接返回NaN;
希望以上分析大家有帮助!如有解释不正确的地方,欢迎批评指正!
本文参考了:https://blog.csdn.net/josavion/article/details/78840700和http://www.cnblogs.com/webBlog-gqs/p/8727677.html