最终结论
大家都认为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
你看,这才是完成的嘛,这就对了嘛,这就研究完了嘛,多有意思,
虽然我觉得一点用都没有,但是我就不喜欢你那种你自己都没摸清楚,到处去帮别人科普,最后大家都不知道什么是对的!写科普,一定要严谨嘛~