我猜这两题你不会(map-parseInt,memo_add)

引言

这篇文章将为大家带来两个面试热题,希望大家看完有所收获。

map-parseInt

面试官:请问下面这段代码的结果是?

js 复制代码
console.log([1,2,3].map(parseInt));

好好好,代码虽短,却可以让你很懵逼,硬着头皮回答 1,2,3

聪明人都知道,答案肯定不是1,2,3,那么接下来让我们来深度剖析一下。

解题碰到不清楚怎么办?最好的方法就是看文档!这里我推荐(MDN)

我们先来看官方文档的描述:

map

map() 方法是一个迭代方法。它为数组中的每个元素调用一次提供的 callbackFn 函数,并用结果构建一个新数组。

我们已知map()方法是一个迭代方法,所以对于[1,2,3]中的每一个元素都会调用一次。

再来看语法,我们这里用到的语法是map(callbackFn),对于里面的参数,为数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。该函数被调用时将传入以下参数:

  • element

  • 数组中当前正在处理的元素。

  • index

  • 正在处理的元素在数组中的索引。

  • array

也就是说,[1,2,3]在调用map()方法时,会先迭代,将数组中的每一个元素构成一个由[element,index,array]组成的数组,再将这个新数组作为参数传入map()中的parseInt方法中。

parseInt

那我们再来看看parseInt方法,同样,我们在文档中查看parseInt方法

先看语法:

scss 复制代码
parseInt(string, radix);
  • string

  • 要被解析的值。如果参数不是一个字符串,则将其转换为字符串 (使用 ToString抽象操作)。字符串开头的空白符将会被忽略。

  • radix_ 可选_

  • 236 的整数,表示进制的基数。例如指定 16 表示被解析值是十六进制数。如果超出这个范围,将返回 NaN。假如指定 0 或未指定,基数将会根据字符串的值进行推算。注意,推算的结果不会永远是默认值 10!文章后面的描述解释了当参数 radix 不传时该函数的具体行为。

我们将map()返回的数组【1,0,[1,2,3]】(拿1来举例子)作为参数传入parseInt中,

string = 1

radix=0(默认为十进制)

结果为1,我们再将由2组成的数组【2,1,[1,2,3]】传入parseInt,

string=2

radix=1

注意,我们这里的进制为2-36 ,超出进制了,所以结果为NaN,最后来看3

string = 3

radix =2

二进制中出现了3,结果当然也是NaN 所以这道题的答案为[1,NaN,NaN]

memo_add

面试官:请你写一个函数,返回两个数的和


我提笔就狠狠地写你这小题

js 复制代码
function add(a,b){
    return a+b
}

面试官说:你走吧~不用来了... 那我们该怎么写呢?

1.永远不要相信用户的输入

不是吧,阿sir?你怎么不按套路出牌,我明明叫你输入两个数字的...没办法,用户是上帝。所以我们必须添加类型判断和参数个数的判断:

js 复制代码
function add(a, b) {
    //...代表参数
    if (arguments.length != 2) {
        throw new Error('参数错误')
    }
    if(typeof a!= 'number' || typeof b!='number'){
        throw new Error('请传入整数')
    }
    return a + b;
}

做完这步,看向面试官,他还是一脸不屑的表情...

2.记忆函数

我们来想想,要是我们重复调用add(),并且调用同一个(a,b)参数,那么我每次调用add()方法,都要重新计算一次,那么我们能不能把运算过的结果存储起来,在进行调用时,先搜索一下,我们是否计算过,如果计算过,那就直接输出。

直接上代码:

js 复制代码
function memoize(fn){
    if(typeof fn != 'function'){
        throw new Error('请传入函数')
        
    }
    var cache = {}//key:value O(1) 空间换时间
    return function(){
        //唯一性 arguments是伪数组,没有join方法
        var key = arguments.length + Array.prototype.join.call(arguments,',');
        console.log(key);
        if(key in cache){
            return cache[key]
        }else{
            return cache[key] = fn.apply(this,arguments)
        }
        
    }
}

先传入一个函数方法当作参数并进行判断,然后定义一个对象cache,接下来返回一个方法 在方法中,我们要向cache中添加键值对,key有一个固定的格式,如果是(a+b),那key就是2a,b ,我们拿到key,首先在cache中查找是否计算过,如果没有,将keyvalue存入cache。用空间换时间,大大减少时间损耗。

写到这里,再来看看面试官:

结尾

本篇内容全是知识,没有水分,愿陪伴大家一起成长,一起进步...

相关推荐
编程零零七1 小时前
Python数据分析工具(三):pymssql的用法
开发语言·前端·数据库·python·oracle·数据分析·pymssql
北岛寒沫2 小时前
JavaScript(JS)学习笔记 1(简单介绍 注释和输入输出语句 变量 数据类型 运算符 流程控制 数组)
javascript·笔记·学习
everyStudy2 小时前
JavaScript如何判断输入的是空格
开发语言·javascript·ecmascript
(⊙o⊙)~哦3 小时前
JavaScript substring() 方法
前端
无心使然云中漫步4 小时前
GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions
前端·javascript
Bug缔造者4 小时前
Element-ui el-table 全局表格排序
前端·javascript·vue.js
xnian_4 小时前
解决ruoyi-vue-pro-master框架引入报错,启动报错问题
前端·javascript·vue.js
麒麟而非淇淋5 小时前
AJAX 入门 day1
前端·javascript·ajax
2401_858120535 小时前
深入理解MATLAB中的事件处理机制
前端·javascript·matlab
阿树梢5 小时前
【Vue】VueRouter路由
前端·javascript·vue.js