前端面试题[“1“,“2“,“3“].map(parseInt)?

[“1”,“2”,“3”].map(parseInt)得到什么?
输出结果:1,NaN,NaN。

先抛出一个关于结果的概念,也是这为什么是这三个值的原因:

  1. map函数传递参数的定义。
  2. parseInt函数正对于radix的理解。
  3. 二进制中没有3这个数码。

好了,有了这样一个最基础的概念我们来具体分析这个问题:

我没猜错大多数人都会先想到结果是[“1”,“2”,“3”] 为什么会产生这样一个想法?因为我们通常使用map函数都会传一个函数,这个函数一般只使用1-2个参数,如下所示

var arr = ["1", "2", "3"].map(function(item){
   // 这个地方只传入一个参数
    return item;
});

console.log(arr);
// ["1", "2", "3"]
1234567
var arr = ["1", "2", "3"].map(function(item, index){
   // 这个地方传入两个参数
    return "value:" + item + ", index:" + index;
});
console.log(arr);
// ["value:1, index:0", "value:2, index:1", "value:3, index:2"]
123456

可以看到以上输入结果取决于传递进去的参数还有function执行的过程

但是在标准的指定下,map方法的参数由三个,数组元素、元素索引、原数组本身。

arr.map(function(item,index,arr){
	........
})
123

在这个时候题目本身就会转为下面的函数求解

let arr=["1","2","3"]
arr.map(function(item,index,arr){
	parseInt(value,index)
})
1234

这个前提是,我们需要知道parseInt函数本身是怎么定义的?

接下来看一下parseInt的官方定义
string: 需要转化的字符,如果不是字符串会被转换,忽视空格符。

radix:数字2-36之前的整型。默认使用10,表示十进制。这个参数的意义是指把前面的字符看作是多少进制的数字,所谓的基数。

如下所示:

 // 将'123'看作5进制数,返回十进制数38 => 1*5^2 + 2*5^1 + 3*5^0 = 38
parseInt('123', 5)
12

需要注意的是,如果radix在2-36之外会返回NaN。

在没有指定基数,或者基数为 0 的情况下,JavaScript 作如下处理:

  • 如果字符串 string 以"0x"或者"0X"开头, 则基数是16 (16进制).
  • 如果字符串 string 以"0"开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5
    规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值
  • 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。
    因为parseInt只接收2个参数,因此map的callback函数就只传递(item, index)这两个值给parseInt。

那么上面的函数就可以分解为求解下面这三个函数的值,并返回结果

parseInt('1', 0); // 1 (parseInt的处理方式,这个地方item没有以"0x"或者"0X"开始,8和10这个基数由实现环境来定,ES5规定使用10来作为基数,因此这个0相当于传递了10)
parseInt('2', 1); // NaN (因为parseInt的定义,超出了radix的界限)
parseInt('3', 2); // NaN (虽然没有超出界限,但是二进制里面没有3,因此返回NaN)
123

再重复总结一下这道题的三个考点:

1. map函数传递参数的定义,此处本身map函数是有3个参数可以传递的
\2. parseInt函数针对于radix这个参数的理解,针对于0,2-36以外界限的定义
\3. 二进制当中没有"3"这个数码

我想结合我上面的分析,再加上我下面的一些知识补充,应该可以对这个问题有一个

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值