1
console.log(['1','2','3'].map(parseInt))  // -> [1,NaN,NaN]

这答案和直觉挺有出入的,奥妙在parseInt

首先,Array.prototype.map为数组的每一项都调用方法,返回值相当于

1
2
3
4
5
6
[
// 传入了该项、该项的下标,其实还会传入第三个参数即原数组
parseInt('1',0),
parseInt('2',1),
parseInt('3',2),
]

map还接收第二个参数thisArg,它会被用作执行回调时的this值

parseInt不仅接受一个字符串string作为第一参数,还接收第二个参数radix作为进制,取值为2~36整数


对于parseInt('1',0),遵循这样的规则:

  • 如果radix是undefined、0或未指定

    • 如果string以0x或0X开头,则以16进制解析字符串

    • 如果string以0开头,则以10进制解析字符串

      这是ES标准,但并非所有浏览器这么支持,取决于浏览器具体实现

    • 如果string以其他任何值开头,则以10进制解析字符串

因此,parseInt('1',0)会以十进制解析’1’,结果是1


对于parseInt('2',1),遵循这样的规则:

  • 如果radix超出2~16的范围且不是0,则返回NaN

因此,parseInt('2',1)会返回NaN


对于parseInt('3',2),遵循这样的规则:

  • 如果string的第一个字符不能转换为数字,则返回 NaN

在二进制中不存在数字3,因此,parseInt('3',2)会返回NaN