['1','2','3'].map(parseInt)的结果你猜对了吗🤷‍♀️

134 阅读2分钟

知其然,更知其所以然,举一反三,融会贯通,很多面试题里经常会看到这个问题,代码量非常的简洁,这里涉及到两个小的知识点,具体来分析一下

map

map是ES6中数组提供的一个方法,其可以对数组中每个元素的调用指定回调函数,并返回包含结果的数组

简单理解是我们可以对数组中每个元素进行循环遍历,把元素处理成我们想要的数据,最终返回一个数组包括这些新的元素(数组长度不变),map的回调函数包括三个参数

array.map((value, index, array) => {})

  • value:数组遍历元素的值

  • index:数组元素的索引

  • array:包含所有元素的数组对象

示例: 通过map函数把数据中的所有价格加上一个符号¥

const arr = [
    {
        id: 1,
        name: "苹果",
        price: '10'
    },
    {
        id: 2,
        name: '橘子',
        price: '20'
    }
]
const newArr = arr.map((value, index) => {
    return {
        ...value,
        price: `¥${value.price}`
    }
})
console.log(newArr)

自定义回调函数写法

利用js函数自动传递参数的特性,可以简写

const arr = [
    {
        name: "苹果",
        price: '10'
    },
    {
        name: '橘子',
        price: '20'
    }
]
const sheArr = (value, index) => {
    return {
        id: index + 1,
        ...value,
        price: `¥${value.price}`
    }
}
const newArr = arr.map(setArr)
console.log(newArr)

parseInt

parseInt是js中的一个内置全局函数,用来解析一个字符串,并返回一个整数

parseInt(string, radix)

  • string: 必选,被解析的字符串

  • radix:可选,解析数据的基数,介于2~36之间

此方法的疑难点在于string的参数,针对不同的传值会有不同的解析规则

  • 开头和结尾的空格是被允许的

  • 字符串中的只有第一个数字会被返回

  • 当字符串第一个非空字符不能转化为数字时,则返回NaN

  • string以0开头,string为number类型,其后的字符解析为8进制或16进制的数字,否则其后字符串解析为10进制整数

  • string以1~9开头,parseInt将把它解析为10进制的整数

  • string以0x或0X开头,parseInt会把string的其余部分解析为16进制的整数

  • radix的基数为2~36的合法数字,如果传0时,则radix以10为基数解析

示例

parseInt(' 44 45 ') // 44
parseInt('23,,45,34') // 23
parseInt('a123') // NaN
parseInt(0101) // 65
parseInt('0101') // 101
parseInt("10.23") // 10
parseInt("123aaa") // 123
parseInt('0X100') // 16的2次方 256
parseInt('123', 1) // NaN

题解

了解上面两个知识点之后,就可以轻松解题了

['1','2','3'].map(parseInt)可以转化为如下代码

const arr = ['1','2','3'].map((value, index) => {
    return parseInt(value, index)
})

分别执行:

  • parseInt('1', 0) radix为0,parseInt默认会根据10进制来解析,结果为1

  • parseInt('2', 1) radix为1,不在2~36范围内, 结果为NaN

  • parseInt('3', 2) radix为2,用二进制来解析,应以 0 和 1 开头,结果为NaN

最终的结果是:[1, NaN, NaN]