别人长文我短文--你肯定知道['1', '2', '3'].map(parseInt),但知道为啥是[1, NaN, NaN]吗

186 阅读2分钟

第一个点: map的入参callback的入参结构:

arr.map(function callback(currentValue[, index[, array]])

arr.map(function callback(当前元素,当前元素下标,arr数组))

第二个点: parseInt的入参:

parseInt(第一个表示被处理的值(字符串),第二个表示为解析时的基数--可以理解为进制-radix)

重点来: 第一眼看结果有点懵--[1, NaN, NaN]

看一下网上答案--看懂了吗

1.  parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。
这个时候返回1
2.  parseInt('2', 1) //基数为1(1进制)表示的数中,最大值小于2,所以无法解析,返回NaN
3.  parseInt('3', 2) //基数为2(2进制)表示的数中,最大值小于3,所以无法解析,返回NaN

参考MDN给出,parseInt出现NaN情况

  • radix 小于 2 或大于 36 ,或
  • 第一个非空格字符不能转换为数字

可能这里你会说parseInt('3', 2)的radix不是为2吗,不满足NaN条件 直接来:2<=radix<=36内的情况,如果出现第一个参数的最高位>=radix的话,就会出现NaN--其实也很容易理解,最高位>=2了,就应该向前进1,举个例子:

parseInt('3', 2)---最高位3,因为3>=2--所以为NaN parseInt('13', 2)---最高位1,因为1<2,且低位为3,只要>=2radix就被舍弃掉--那就等同如下: parseInt('13', 2)==parseInt('1', 2)==1//true

直接四行总结:

1.有非数字字符,直接从(包含字符)位置进行舍弃

parseInt('1l1h13', 2) ==1//true

2.有非数字字符,且是第一个位置含有,直接为NaN

parseInt('k1l1h13', 2) //NaN

3.第二个参数radix不在2和36范围内,直接为NaN

parseInt('1', 37)//NaN

4.第二个参数radix在2和36范围内,如果最高位是>=radix,直接为NaN,如果不是,就舍弃该 位置后面数字(包含该位置)

parseInt('31', 2)//NaN

parseInt('31', 3)//NaN

parseInt('131', 3)==parseInt('1', 3)==1//true

5.radix为0情况

parseInt('1', 0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。