parseInt详解-你以为radix指的进制吗?

最终结论

大家都认为parseInt(String,radix)的radix就是进制数,其实根本就不是这样!!!


前言

为什么会研究parseInt呢?

因为我在研究js的时候,惊讶的看到了这个问题,哇 这个题出的真的,你像个鬼一样

突然觉得还有这种骚写法,惊讶之余就是,那这结果到底是什么?

['1','2','3'].map(parseInt)

我开始以为结果是 1,2,3 不就是转成整数吗?这个简单,你这不是在哄孩子吗,hhhh教练我会这个!

结果控制台一输,知道结果的我眼泪掉下来


果然,还是我太年轻,于是我开始疯狂分析



一、map函数

定义和用法

map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

map() 方法按照原始数组元素顺序依次处理元素。

注意: map() 不会对空数组进行检测。

注意: map() 不会改变原始数组。

首先,我们来看一下map函数的参数

array.map(function(currentValue,index,arr), thisValue)

我们这里主要研究map的第一个参数

它是一个匿名函数,有三个参数,分别是(当前元素,当前遍历的元素索引,和原数组)

这个题目呢,我们传入了一个parseInt函数,也就是相当于

array.map(parseInt(currentValue,index));   //由于parseInt只接受两个参数,所以arr被舍弃

所以这个题目

['1','2','3'].map(parseInt)

变成了这样

parseInt('1',0);       // 1

parseInt('2',1);       // NaN 

parseInt('3',2);      // NaN 

可是这是为什么呢???

接着我们开始分析今天的主角parseInt



二、parseInt函数

parseInt的手册是这样说的

parseInt() 函数可解析一个字符串,并返回一个整数。

语法:parseInt(string, radix)


我们这里重点关心radix这个是个什么东西

1、radix可选。

2、表示要解析的数字的基数。该值介于 2 ~ 36 之间。

3、如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。

4、如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

这是官方的说法。

作为学渣的我瞬间蒙了,这个基数是什么东西?这是?数学知识???

在学习数学知识之前,想起来手头有一本红宝书(JavaScript高级语言设计),这可是咱花了大几十大洋买的,要去查查,于是我在

第三章---基本概念---Number类型---4数值转换------里找到了关于parseInt的说明(31-32页)

结果书里举了很多例子--原书例子

指定的基数会影响转换的输出结果。例如:

var num1 = parseInt("10",2);          //2 (按二进制解析)

var num2 = parseInt("10",8);          //8 (按八进制解析)

var num3 = parseInt("10",10);        //10 (按十进制解析)

var num4 = parseInt("10",16);         //16 (按十六进制解析)

看到这里我就明白了,噢~原来是进制啊,那还搞什么鬼,直接说进制不就好了吗,为什么还要说基数?搞一些花里胡哨的。看到这里请继续看完,事实告诉我,我又年轻了 

那这这个题目好做了嘛, 不就是这样的吗

parseInt('1',0);       // 1   //radix是0的时候,按16/8进制解析,但是如果开头是1-9就按10进制解析,所以是1

parseInt('2',1);       // NaN  // radix参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

parseInt('3',2);      // NaN   // radix的参数是2,所以按二进制解析,而二进制最大为1,只能为0,1, 3显然超了,转换不了,所以是NaN

这个题目是解出来了,但是!

你以为有这么简单吗???

正当我快乐的时候!

我开始思考,基数是什么???这明明就是进制数,为啥是基数???

官方是智障吗?不,我更愿意相信我是智障!

于是我又去测试了一波


??????????

我懵了,6进制里为啥能有7,为啥还有8,8进制为什么能有9,为什么写一位就NaN???

为什么写两位数就有结果,结果还这么奇怪?

完全傻掉,我麻了爪子

不就是基数吗我去百度还不成吗

百度百科

百度之后我就更傻了,这是什么东西哇

陷入了恐慌,js这么难吗???

于是我又到处查阅了资料得到了结果!


三、最终结论


大家都认为radix就是单纯的就是进制数,其实根本就不是这样!!!

大家都认为radix就是单纯的就是进制数 , 其实根本就不是这样!!!

大家都认为radix就是单纯的就是进制数 , 其实根本就不是这样!!!


它还是做了内部处理的!

我们用5为例

parseInt("45",5) 当解析45时,4属于范围内,所以得到4,但是5不属于,所以走到这里直接把后面抛弃掉相当于parseInt("4",5); ---最终得到4。

parseInt("454",5) 当解析454时,4属于范围内,所以得到4,但是5不属于,所以走到这里直接把后面全部抛弃掉相当于parseInt("4",5); ---最终得到4。 

parseInt("44",5) 当解析44时,4属于范围内,后面那个4还是在范围内,所以,算作一个整体,属于正常,不进行任何操作   根据进制算法,最终算出,从右往左 4*5^0+4*5^1 = 24

parseInt("445",5) 当解析445时,4属于范围内,后面那个4还是在范围内, 但是在后面的5不属于, 所以,5抛弃掉,只取44,相当于 parseInt("44",5); , 根据进制算法,最终算出,从右往左 4*5^0+4*5^1 = 24

parseInt("544",5) 当解析544时,5直接不属于范围内,所以全部抛弃掉,只取""相当于parseInt("",5); 返回NaN

parseInt("5",5) 当解析5时,5直接不属于范围内,所以全部抛弃掉,只取"", 相当于parseInt("",5); 返回NaN


你看,这才是完成的嘛,这就对了嘛,这就研究完了嘛,多有意思,

虽然我觉得一点用都没有,但是我就不喜欢你那种你自己都没摸清楚,到处去帮别人科普,最后大家都不知道什么是对的!写科普,一定要严谨嘛~

你可能感兴趣的:(parseInt详解-你以为radix指的进制吗?)