面试官:['1', '2', '3'].map(parseInt)的结果是什么?为甚?我:[1, 2, 3]。面试官:你不用来了。

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 今天看到一道题,`['1', '2', '3'].map(parseInt)`的结果是什么?
Hi~,我是 一碗周,一个在舒适区垂死挣扎的前端,如果写的文章有幸可以得到你的青睐,万分有幸~

面试官:['1', '2', '3'].map(parseInt)的结果是什么?为甚?

我:[1, 2, 3]

面试官:你不用来了。

写在前面

今天看到一道题,['1', '2', '3'].map(parseInt)的结果是什么?看到这个题下意识的觉得答案就是[1, 2, 3],但实际上,答案是[1, NaN, NaN],这是为什么呢?我们来一探究竟。

parseInt函数

首先我们来看一下parseInt()函数,关于parseInt()函数,MDN中是这样介绍的:parseInt(string, radix)将一个字符串string转换为radix进制的整数, radix为介于2-36之间的数。返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回NaN

到这为止,我们对parseInt()函数有了一个基础的了解,根据上面的描述,也就是说我们为parseInt()的第二个参数传递一个非2-36之间的数,返回结果是NaN,我们来测试一下:

console.log(parseInt(10, 0)) // 10
console.log(parseInt(10, 1)) // NaN
console.log(parseInt(10, 37)) // NaN

按照我们的思路,这里的结果应该是3个NaN,但实际并不是,关于radix参数,在MDN中有明确的解释:

如果 radix 是 undefined、0或未指定的,JavaScript会假定以下情况:

1. 如果输入的 string以 "0x" 或 "0x"(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被当做十六进制数去解析。
2. 如果输入的 string 以 "0"(0)开头, radix 被假定为8(八进制)或10(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用parseInt时,一定要指定一个 radix。
3. 如果输入的 string 以任何其他值开头, radix 是 10 (十进制)。

这就解释了我们的parseInt(10, 0)的结果是10了。

Array.prototype.map方法

现在我们来了解一下map方法的作用,该方法接受两个参数,第一个是一个回调函数,数组中的每一项都会执行该函数,这个回调函数接受三个参数,第一个是正在处理的元素,第二个是正在处理的索引,第三个是当前数组;第二个参数是调用回调函数的this

下面代码中展示了Array.prototype.map方法的基础用法:

function doubleNum(n, i) {
  let doubleN = 2 * n
  console.log(`第{i+1}个元素的的二倍是${doubleN}`)
  return doubleN
}
let newArr = [1, 2, 3].map(doubleNum)
console.log(newArr)
/* 执行结果如下:
第{i+1}个元素的的二倍是2
第{i+1}个元素的的二倍是4
第{i+1}个元素的的二倍是6
[ 2, 4, 6 ]
 */

如果上面的写法看不懂,我们可以将函数移动一下位置,代码如下:

let newArr = [1, 2, 3].map(function (n, i) {
  let doubleN = 2 * n
  console.log(`第{i+1}个元素的的二倍是${doubleN}`)
  return doubleN
})

解题

经过上面的介绍,现在我们应该已经知道的这个题的结果了,它的运行情况如下:

  • parseInt('1', 0),直接按照10进制解析,结果为1;
  • parseInt('2', 1),传入了非2~36的值,结果为NaN;
  • parseInt('3', 2),按照2进制进行解析,2进制可以解析的数字只有1和0,所以返回NaN

知道了这一题的答案,我们来看一下下面这个代码片段,它的运行结果又是什么:

['10','10','10','10','10'].map(parseInt);
  • 首先parseInt('10', 0)的结果是10,不用解释;
  • 然后parseInt('10', 1)的结果是NaN,我们前面也解释过了;
  • parseInt('10', 2)的结果是2,这是因为10被转换为二进制就是2;
  • parseInt('10', 3)的结果是3,10被转换为三进制就是3;
  • parseInt('10', 4)以此类推。

最终结果是[10, NaN, 2, 3, 4]

目录
相关文章
|
JavaScript 前端开发
[阿里巴巴最新面试题----JavaScript中map(parseInt)的问题]
[阿里巴巴最新面试题----JavaScript中map(parseInt)的问题]
60 0
|
存储 安全 NoSQL
Java并发Map的面试指南:线程安全数据结构的奥秘
在计算机软件开发的世界里,多线程编程是一个重要且令人兴奋的领域。然而,与其引人入胜的潜力相伴而来的是复杂性和挑战,其中之一就是处理共享数据。当多个线程同时访问和修改共享数据时,很容易出现各种问题,如竞态条件和数据不一致性。
|
安全 Java
【面试】Java集合中List,Set以及Map等集合体系详解
【面试】Java集合中List,Set以及Map等集合体系详解
65 0
|
3月前
|
Java
【Java集合类面试二十二】、Map和Set有什么区别?
该CSDN博客文章讨论了Map和Set的区别,但提供的内容摘要并未直接解释这两种集合类型的差异。通常,Map是一种键值对集合,提供通过键快速检索值的能力,而Set是一个不允许重复元素的集合。
|
3月前
|
算法 Java 索引
【Java集合类面试四】、 描述一下Map put的过程
这篇文章详细描述了HashMap中put操作的过程,包括首次扩容、计算索引、插入数据以及链表转红黑树和可能的再次扩容。
【Java集合类面试四】、 描述一下Map put的过程
|
3月前
|
安全 Java
【Java集合类面试五】、 如何得到一个线程安全的Map?
如何得到一个线程安全的Map的方法包括:使用Collections工具类将Map包装为线程安全,使用java.util.concurrent包下的ConcurrentHashMap,以及不推荐使用性能较差的Hashtable。
|
3月前
|
安全 Java
【Java集合类面试三】、Map接口有哪些实现类?
这篇文章介绍了Java中Map接口的几种常用实现类:HashMap、LinkedHashMap、TreeMap和ConcurrentHashMap,以及它们适用的不同场景和线程安全性。
|
5月前
|
消息中间件 安全 Java
高德面试:为什么Map不能插入null?
在 Java 中,Map 是属于 java.util 包下的一个接口(interface),所以说“为什么 Map 不能插入 null?”这个问题本身问的不严谨。Map 部分类关系图如下: ![image.png](https://cdn.nlark.com/yuque/0/2024/png/92791/1717578225132-241fa833-180d-41ab-95eb-3d7cd1118633.png#averageHue=%233f3424&clientId=u395c5adf-4577-4&from=paste&height=687&id=u98d6a0bc&originHeig
47 1
|
6月前
|
前端开发 程序员
【面试题】在循环 for、for-in、forEach、for-of 、map中改变item的值,会发生什么?
【面试题】在循环 for、for-in、forEach、for-of 、map中改变item的值,会发生什么?
|
存储 编译器 C++
【C++从0到王者】第三十五站:面试官让手撕红黑树,我直接向他秀一手手撕map与set
【C++从0到王者】第三十五站:面试官让手撕红黑树,我直接向他秀一手手撕map与set
73 0