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个参数currentValue
、index
、array
。currentValue
是数组中当前元素,index
是当前元素的index,array
是调用map
函数的数组。
而parseInt
的函数签名如下:
parseInt(string, radix);
其中,string
是被解析的字符串,如果传入的不是字符串,则会先被ToString
(abstract operation)转换成为字符串。字符串中的空白符前缀会被忽略。radix
是一个2~36之间的一个整数,用于指定解析时采用的基数。
因此,调用parseInt
时,它实际接收到了array.map
传来的三个参数,但是只使用到了前两个,也就是currentValue
和index
。
当执行['1', '2', '3'].map(parseInt)
时,parseInt
被调用了三次,即parseInt('1',0)
、parseInt('2',1)
、parseInt('3',2)
。
第一次调用时,传入的radix
是0。JavaScript对于radix
是undefined
或者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
。