map parseInt(笔试题笔记)

参考连接

map的使用
parseInt的使用javascript

在作笔试题时遇到这样下面这样一个问题java

['103','101','1000010'].map(parseInt)
复制代码

一开始,想固然地觉得输出结果是103,101,1000010。 但当咱们使用控制台输出时,眉头一皱,发现事情并无那么简单:数组

[101, NaN, 66] // output
复制代码

咱们来看一下MDN上关于map方法的介绍bash

var new_array = arr.map(function callback(currentValue[, index[, array]]) {
 // Return element for new_array 
}[, thisArg])
复制代码

map

map接收两个参数,一个是callback,一个是this.函数

  1. callbackui

    生成新数组元素的函数,使用三个参数:
    currentValue--->callback表示数组中正在处理的当前元素,necessary必选参数。this

    index--->callback 数组中正在处理的当前元素的索引,可选参数。spa

    array--->callback方法被调用的数组,可选参数。code

  2. thisArg可选对象

    执行callback 函数时使用的this 值,若是省略,则值为undefined。若是this的值为null或者undefined则默认指向window.

经过下面这个例子咱们就能大体掌握map的用法。

var numbers = [1, 4, 9];
var roots = numbers.map(Math.sqrt);
// roots的值为[1, 2, 3], numbers的值仍为[1, 4, 9]
复制代码

接下来,咱们再回顾一下这样一个知识点:

参数传递

Javascript中的函数可使用任意数量的参数调用,即便它们不等于声明的函数参数的数量。缺乏的参数被视为未定义,而多余的参数会被忽略(但会存储在相似数组的参数对象中)。*

function foo(x, y) {
    console.log(x);
    console.log(y);
}
foo(1, 2);      // 1, 2
foo(1);         // 1, undefined
foo(1, 2, 3);   // 1, 2
复制代码

parseInt

咱们注意到在Number原型上也有一个parseInt方法,全局对象上也有一个parseInt方法。那他们两个之间存在什么关系呢?

Number.parseInt === parseInt   // 输出为true
复制代码

说明两个指向同一个对象。


parseInt的用法

parseInt有两个参数:stringradix(进制)。若是提供的radix(进制)为空或者为假值,进制(基数)默认设置为10。radix 为介于2-36之间的数。

有了上面的知识,咱们再回过头来看这道笔试题:

['103','101','1000010'].map(parseInt)
复制代码

咱们来分析一下,它的执行流程:

上面的写法与下面实际上是等价的

['103','101','1000010'].map(parseInt(currentValue,index,['103','101','1000010']))
复制代码

第一次循环

parseInt('103',0,['103','101','1000010'])//由于0是假,因此使用默认`radix`为10,对于['103','101','1000010']这个多余的参数则会被忽略,因此输出103
复制代码

第二次循环

parseInt('101',1,['103','101','1000010'])//radix 为介于2-36之间的数。当radix===1时会返回NaN

//
parseInt('0000000',1)
复制代码

第三次循环

parseInt('1000010',2,['103','101','1000010'])// 字符串则会被当成是二进制字符串解析,因此输出66
复制代码

parseInt的注意事项

咱们来看这样一个例子:

parseInt('12345',4)   //这个题目会输出什么呢?
复制代码

在四进制中,是不存在45的,那么parseInt会对其进行怎样的处理呢?

parseInt('12345',4) // 输出27   3*4^0+2*4^1+1*4^2=27
复制代码

基于此,咱们能够合理推测parseInt会忽略大于等于4的字符。

那若是string后面还出现了小于4的字符呢?好比

parseInt('1234331',4)// 一样输出27
复制代码

基于此,咱们能够作出这样的推论,只要在字符串中出现大于等于radix的数值,字符串就会今后位置开始被截断,parseInt会忽略后面的字符。

经过这道笔试题,让我更加发现了本身的不足,之后要继续加油。

相关文章
相关标签/搜索