map(parseInt) - panchaow/blog GitHub Wiki

['1', '2', '3'].map(parseInt) what & why?

array.map的函数签名如下:

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
    // Return element for new_array
}[, thisArg])

map接收的第一个参数是callback函数,该函数将接收3个参数currentValueindexarraycurrentValue是数组中当前元素,index是当前元素的index,array是调用map函数的数组。

parseInt的函数签名如下:

parseInt(string, radix);

其中,string是被解析的字符串,如果传入的不是字符串,则会先被ToString(abstract operation)转换成为字符串。字符串中的空白符前缀会被忽略。radix是一个2~36之间的一个整数,用于指定解析时采用的基数。

因此,调用parseInt时,它实际接收到了array.map传来的三个参数,但是只使用到了前两个,也就是currentValueindex

当执行['1', '2', '3'].map(parseInt)时,parseInt被调用了三次,即parseInt('1',0)parseInt('2',1)parseInt('3',2)

第一次调用时,传入的radix是0。JavaScript对于radixundefined或者0的处理:

  • 如果string以"0x"或者"0X"开头,则认为radix为16
  • 如果string以"0"开头,则认为radix为8或者10(implementation-dependent)
  • 其他情况,则认为radix为10 因此,第一次调用的返回值是1。

第二次调用,传入的radix是1,这不是一个合法的radix取值,返回NaN

第三次调用,传入的string是"3",这不是合法的二进制数。如果string的第一个字符不能被正确地解析,parseInt返回NaN。因此第三次调用的返回值依旧是NaN

实际上,parseInt('-', 2)也是返回NaN