看完标题,入坑过的同学脑海里很快会浮现出这道经典面试题,没碰到过的同学不妨跟着楼主先来复习一遍 parseInt 的用法(主要参考 MDN)。

parseInt 是 JavaScript 中的一个全局函数(顶级函数),它会将给定的字符串以指定基数(radix/base)解析成为整数。

它的语法非常简单:

parseInt(string, radix)

第一个参数 string 是要被解析的值,如果参数不是一个字符串,则将其转换为字符串,字符串开头的空白符将会被忽略。而第二个参数 radix 是一个 2 到 36 之间的整数值,用于指定转换中采用的基数,如果不传入,默认是 10,即按照十进制转换,这里要注意一点,如果第二个参数传入 0,和传入 10 以及不传入第二个参数等效。函数返回一个整数值,如果解析过程中发生错误,将返回 NaN。

返回 NaN 的主要有以下几种情况:

  • 被解析参数的第一个字符无法被转化成数值类型
  • 被解析参数数值太大,不是 radix 进制下的合法数字
  • radix 不在 [2, 36] 范围内(注意其实 0 也是可以的)
console.log(parseInt('hello', 2)); // NaN
console.log(parseInt('3', 2)); // NaN, 3 不是合法的二进制数字
console.log(parseInt('3', 100)); // NaN

其实实际开发中我很少用 parseInt,而是用 +~~ 代替,因为它实在是太长了,但是很显然 parseInt 的使用范围更广。

简单回顾了 parseInt 的用法,我们来看这道题:

let ans = ["1", "2", "3"].map(parseInt);
console.log(ans);

和大多数人一样,我的第一反应也是返回 [1, 2, 3],这个时候我们有必要回顾下 Array.prototype.map,该方法的参数是一个函数,而该函数又可以接受三个参数,分别表示数组元素的值,数组元素的在数组中的索引,以及对于数组的引用。一般来说我们直接在 map 方法中传入匿名函数,但是如果这个函数是在外面定义的,传入的是方法名呢?

let fn = (...a) => {
  console.log(a);
};

let ans = ["1", "2", "3"].map(fn);

// [ '1', 0, [ '1', '2', '3' ] ]
// [ '2', 1, [ '1', '2', '3' ] ]
// [ '3', 2, [ '1', '2', '3' ] ]

我们可以看到,如果没为该函数指定参数,那么这三个参数都会被传入!

我们再回到这道题,parseInt 方法是可以传入 1-2 个参数的,所以 map 传入的三个参数,其实是都会被传给 parseInt 方法的,只是 parseInt 会使用前两个参数而已

console.log(parseInt('12', 10, 'ignore')); // 12

所以整个过程差不多是这样的:

let fn = (item, index, array) => {
  return parseInt(item, index, array);
};

let ans = ["1", "2", "3"].map(fn);
console.log(ans); // [ 1, NaN, NaN ]

其实就是计算如下:

console.log(parseInt("1", 0)); // 1
console.log(parseInt("2", 1)); // NaN
console.log(parseInt("3", 2)); // NaN

看懂了吧不妨再试试下面这道:

let ans = "1 2 3".replace(/\d/g, parseInt);
console.log(ans);

原理是一样的,当 replace 的第二个参数是函数的时候,该函数的第一个参数是匹配模式的字符串,接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或者多个这样的参数。接下来的参数是一个整数,声明了匹配在 StringObject 中出现的位置,最后一个参数是 StringObject 本身。

还是一样,打印出来看看呗:

let fn = (...a) => {
  console.log(a);
};

let ans = "1 2 3".replace(/\d/g, fn);

// [ '1', 0, '1 2 3' ]
// [ '2', 2, '1 2 3' ]
// [ '3', 4, '1 2 3' ]

接下去就简单了,就是计算下面的表达式了:

console.log(parseInt("1", 0, '1 2 3')); // 1
console.log(parseInt("2", 2, '1 2 3')); // NaN
console.log(parseInt("3", 4, '1 2 3')); // 3

关于 parseInt 的一道有意思的面试题的更多相关文章

  1. 一道有意思的笔试题引发的对于new操作符的思考

    楼主比较喜欢看一些很短但很有意思的题目,无意间又瞥到了一题,大家不妨可以一试.(原题链接猛戳这里) function Fn1() { this.name = 'peter'; return { nam ...

  2. 一道简单的面试题,难倒各大 Java 高手!

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 最近栈长在我们的<Java技术栈知识星球>上分享的一道 Java 实战面试题,很有意思,现在拿出来和大家分享下, ...

  3. 【Android】一道Android OpenGL笔试题

    一道Android OpenGL笔试题 SkySeraph May. 5th 2016 Email:skyseraph00@163.com 更多精彩请直接访问SkySeraph个人站点:www.sky ...

  4. 解析js中作用域、闭包——从一道经典的面试题开始

    如何理解js中的作用域,闭包,私有变量,this对象概念呢? 就从一道经典的面试题开始吧! 题目:创建10个<a>标签,点击时候弹出相应的序号 先思考一下,再打开看看 //先思考一下你会怎 ...

  5. 一道SQL的面试题之联想

    一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给 ...

  6. 一些有意思的面试题(持续更新) .C语言编程技巧札记

    一些有意思的面试题(持续更新) http://blog.csdn.net/wangyuling1234567890/article/details/38565239 C语言编程技巧札记 http:// ...

  7. 记录一道有意思的js题目

    偶然机会,在codewars上面开始做题,遇到一道有意思的题目,记录一下: 题目是这样的: In this kata, you will write a function that returns t ...

  8. 一道有意思的多线程面试题 C# 代码实现

    如果你对多线程的控制不怎么了解,那么理解了这篇文章的内容也许对你有帮助.鼓励先自己动手实现一遍,做不出来在看代码. 题目一:两个线程交替打印0~100的奇偶数 这道题就是说有两个线程,一个名为偶数线程 ...

  9. 一道有意思的 CSS 面试题,FizzBu​​zz ~

    FizzBu​​zz 是一道很有意思的题目.我们来看看题目: 如果遇见了 3 的倍数要说 Fizz,5 的倍数就说 Buzz,如果即是 3 的倍数又是 5 的倍数就说 FizzBuzz. 如果是在一些 ...

随机推荐

  1. 小结IE6的坑

    1.z-index在position:relative/absolute等定位属性设置后还是无效,会导致top栏的导航栏目的子菜单被下面的层遮住,无法显示:解决办法:?http://www.wufan ...

  2. 2.11. 创建托管对象(Core Data 应用程序实践指南)

    到现在为止,还没有创建过托管对象,回顾了一下,只是创建了托管对象模型,持久化存储区,持久化存储协调器,托管对象上下文. 那么,现在就来创建托管对象吧. 使用NSEntityDescription 的 ...

  3. iOS 项目上线流程

    一.证书的导出      1.1 前期工作        首先你需要有一个苹果的开发者帐号,一个Mac系统.        如果没有帐号可以在打开http://developer.apple.com/ ...

  4. JS 上传文件 Uploadify 网址及 v3.2.1 参数说明

    http://www.uploadify.com/ 一.属性 属性名称 默认值 说明 auto true 设置为true当选择文件后就直接上传了,为false需要点击上传按钮才上传 . buttonC ...

  5. HDU2066:一个人的旅行(Dijkstra)

    Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰 ...

  6. js原生设计模式——2面向对象编程之js原生的链式调用

    技巧点:对象方法中返回当前对象就可以链式调用了,即方法中写return this; <!DOCTYPE html><html lang="en"><h ...

  7. Java Web快速入门——全十讲

    Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...

  8. Canvas createLinearGradient API

    createLinearGradient addColorStop <!DOCTYPE html> <html lang="en"> <head> ...

  9. MIPS 跳转指令BAL vs JAL

    今天调试程序,发现在windows和Linux下,diab编译的结果不一样,一个能跑一个不能跑.最后定位到了函数跳转上. 程序代码里的函数跳转写的是BAL,在windows下编译结果正常,在Linux ...

  10. Java字符串之String与StringBuilder

    String与SringBuiler的一些比较   在Java中,我们会大量使用字符串,但是String究竟是怎样工作的我们可能没有想过太多,其实在String类中,每一个看起来会修改String值的 ...