-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Open
Labels
Description
第一眼看到这个题目的时候,脑海跳出的答案是 [1, 2, 3],但是真正的答案是[1, NaN, NaN]。
- 首先让我们回顾一下,map函数的第一个参数callback:
var new_array = arr.map(function callback(currentValue[, index[, array]]) { // Return element for new_array }[, thisArg])
这个callback一共可以接收三个参数,其中第一个参数代表当前被处理的元素,而第二个参数代表该元素的索引。
-
而parseInt则是用来解析字符串的,使字符串成为指定基数的整数。
parseInt(string, radix)
接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数。 -
了解这两个函数后,我们可以模拟一下运行情况
- parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。这个时候返回1
- parseInt('2', 1) //基数为1(1进制)表示的数中,最大值小于2,所以无法解析,返回NaN
- parseInt('3', 2) //基数为2(2进制)表示的数中,最大值小于3,所以无法解析,返回NaN
-
map函数返回的是一个数组,所以最后结果为[1, NaN, NaN]
-
最后附上MDN上对于这两个函数的链接,具体参数大家可以到里面看
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/parseInt
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map
webzhaochong, shiiiiiiji, dz333333, RobinZhao00, KChrisZhang and 309 moreArthas625022055, michaelChe956, hcyfreedom, DreamMakerVVD, Grace-GIRL and 21 morevajsp, jackjsj, ashenquin, 123KITTY, xzgg and 6 more123KITTY, HerokunTan, jinpikaFE, 790891601, ii3lack and 1 morefakestudy, jtchen2k, 790891601, lzysk and RonedMarsVino, 123KITTY, tzzhmm, Fanningyuan, Aaronwkk and 3 moregenwohuijia, kukufengfeng, TianGetsuKin, ning5129, XIGGG and 24 more
Metadata
Metadata
Assignees
Labels
Type
Projects
Milestone
Relationships
Development
Select code repository
Activity
[-]['1', '2', '3'].map(parseInt) 解析[/-][+]第二题:['1', '2', '3'].map(parseInt) 解析[/+]mengfei-nie commentedon Feb 13, 2019
parseInt 基数是一个介于2和36之间的整数 可能第二点这个说法不太准确
atheist1 commentedon Feb 14, 2019
在30-seconds-of-code看到一个这个题的变形,分享一下
xingorg1 commentedon Feb 15, 2019
我开始也这么理解:第二个参数需要的范围是2~36之间,如果小于 2 或者大于 36,则 parseInt() 将返回 NaN。但是parseInt(5,4),第二个参数在[2,36]之间,但是结果依旧返回NaN啊。
所以后俩返回NaN,我们是不是又两种角度可以理解呢?
sisterAn commentedon Feb 16, 2019
这是今天在 Advanced-Frontend组织 看到一个比较有意思的题目。
主要是讲JS的映射与解析
早在 2013年, 加里·伯恩哈德就在微博上发布了以下代码段:
parseInt
parseInt()
函数解析一个字符串参数,并返回一个指定基数的整数 (数学系统的基础)。string
要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。radix
一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。默认为10。返回值
返回一个整数或NaN注意:
在
radix
为 undefined,或者radix
为 0 或者没有指定的情况下,JavaScript 作如下处理:更多详见parseInt | MDN
map
map()
方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果。可以看到
callback
回调函数需要三个参数, 我们通常只使用第一个参数 (其他两个参数是可选的)。currentValue
是callback 数组中正在处理的当前元素。index
可选, 是callback 数组中正在处理的当前元素的索引。array
可选, 是callback map 方法被调用的数组。另外还有
thisArg
可选, 执行 callback 函数时使用的this 值。更多详见Array.prototype.map() | MDN
回到真实的事例上
回到我们真实的事例上
对于每个迭代
map
,parseInt()
传递两个参数: 字符串和基数。所以实际执行的的代码是:
即返回的值分别为:
所以:
由此,加里·伯恩哈德例子也就很好解释了,这里不再赘述
如何在现实世界中做到这一点
如果您实际上想要循环访问字符串数组, 该怎么办?
map()
然后把它换成数字?使用编号!本文始发于我的博客:['1', '2', '3'].map(parseInt) what & why ?
jialinhome commentedon Feb 18, 2019
parseInt(string, radix)
这道题的关键点在于parseInt的返回值类型,MDN中说返回值类型为10进制,具体是把string所对应的值当做radix对应的进制看待,然后转换成相应的10进制值。
所以在parseInt('3', 2) 中,'3'在2进制中是一个非法的值,2进制中只能存在0和1,所以最后返回了NAN
ravencrown commentedon Feb 18, 2019
parseInt(string, radix),radix在 (2, 8)的时候,Number(string) < radix。
lmislm commentedon Feb 18, 2019
4进制最大数是3,5大于3,所以NaN。
ravencrown commentedon Feb 18, 2019
ratio 值为 (2, 8)的时候,parseInt的第一个参数必须小于ratio
Jer-X commentedon Feb 19, 2019
第二个参数是处于2~36没错,但是第二个参数代表解析的进制数,在四进制里面是不可能会出现5这个数字的,所以返回的就是NaN,要想转成5的话应该是parseInt('11', 4)结果就是5
yinyangshibolange commentedon Feb 19, 2019
copyed from W3School
yishuihan-001 commentedon Feb 19, 2019
['1', '2', '3'].map(parseInt)等价于[parseInt('1',0), parseInt('2',1), parseInt('3',2)]
formattedzzz commentedon Feb 19, 2019
总之 radix在[2-9]区间内 Number(string.charAt(0)) 不能大于等于 radix
0x和0X开头的默认都是 16进制字符串转10进制 如果指定了radix 那么都是按常规字符串处理=>0
104 remaining items
GuoguoDad commentedon May 18, 2022
第二点解释不妥当,当parseInt 第二个参数radix 小于 2 或大于 36时,parseInt直接返回 NaN
Yuweiai commentedon May 25, 2022
答案:
[1, NaN, NaN]
parseInt('1', 0)
:parseInt('2', 1)
:parseInt('3', 2)
:Bee-XG commentedon Jun 23, 2022
parseInt(5,4) 是因为规定的是按四进制解析 但是5 明显已经超出了 四进制的最大值 所以被解析为 了 NaN
Yangfan2016 commentedon Aug 3, 2022
好经典的题 360 考过
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt
yinzuowen commentedon Aug 15, 2022
基数的范围是2-36,不在此范围内,parseInt直接返回NaN
xiaogu-123 commentedon Nov 22, 2022
===> 看了老哥的解析瞬间明白了,思路清晰
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还是在范围内,所以,算作一个整体,属于正常,不进行任何操作 根据进制算法,最终算出,从右往左 45^0+45^1 = 24
parseInt("445",5) 当解析445时,4属于范围内,后面那个4还是在范围内, 但是在后面的5不属于, 所以,5抛弃掉,只取44,相当于 parseInt("44",5); , 根据进制算法,最终算出,从右往左 45^0+45^1 = 24
parseInt("544",5) 当解析544时,5直接不属于范围内,所以全部抛弃掉,只取"", 相当于parseInt("",5); 返回NaN
parseInt("5",5) 当解析5时,5直接不属于范围内,所以全部抛弃掉,只取"", 相当于parseInt("",5); 返回NaN
Bibooo25730 commentedon May 30, 2023
脑壳疼
xiaogu-123 commentedon May 30, 2023
ChengYu08 commentedon Nov 16, 2023
将字符串解析指定为 指定进制 字符串中的值应该小于 进制的值 不然返回NaN
如果不传 (或者为0) 默认是10进制。小数转10进制 默认向下取整
parseInt("字符串",进制) 意思是将字符串看成 ?进制 解析 然后返回10进制的数
parseInt('100', 2); 000 001 010 011 100 ==>4
parseInt("17",8); 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17 ==>15
parseInt("11",2); 00 01 10 11 =》 3
xiaogu-123 commentedon Nov 16, 2023
gamejoye commentedon Aug 12, 2024
parseInt(5, 4)是NaN是因为 5不能用4进制来表示
xiaogu-123 commentedon Aug 12, 2024
wangyujie615 commentedon Mar 10, 2025
['1','2','3'].map(parseInt)
//==>
['1','2','3'].map((value,index)=>{ parseInt(value,index)})
//parseInt('1',0) radix = 0 是10
//parseInt('2',1) radix < 2 是NaN
//parseInt('3',2) radix = 2 意味着每个位置的最大值是1 只有0 1
console.log(['1', '1', '10','21','33'].map(parseInt))
//输出:1 NaN 2 7 15
//parseInt('1',0) radix = 0 是10 所以输出为1
//parseInt('1',1) radix < 2 是NaN
//parseInt('10',2) radix = 2 意味着每个位置的最大值是1 只有0 1 ==>12^1+02^0 = 2
//parseInt('21',3) radix = 3 意味着每个位置的最大值是2 只有0 1 2 ==>23^1+13^0 = 7
//parseInt('33',4) radix = 4 意味着每个位置的最大值是3 只有0 1 2 3 ==>34^1+34^0 = 15
xiaogu-123 commentedon Mar 10, 2025
brother-forteen commentedon Mar 10, 2025