引言
这篇文章将为大家带来两个面试热题,希望大家看完有所收获。
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)
,对于里面的参数,为数组中的每个元素执行的函数。它的返回值作为一个元素被添加为新数组中。该函数被调用时将传入以下参数:
也就是说,[1,2,3]在调用map()
方法时,会先迭代,将数组中的每一个元素构成一个由[element,index,array]
组成的数组,再将这个新数组作为参数传入map()
中的parseInt
方法中。
parseInt
那我们再来看看parseInt
方法,同样,我们在文档中查看parseInt
方法
先看语法:
scss
parseInt(string, radix);
-
要被解析的值。如果参数不是一个字符串,则将其转换为字符串 (使用
ToString
抽象操作)。字符串开头的空白符将会被忽略。 -
radix
_ 可选_ -
从
2
到36
的整数,表示进制的基数。例如指定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
中查找是否计算过,如果没有,将key
和value
存入cache
。用空间换时间,大大减少时间损耗。
写到这里,再来看看面试官:
结尾
本篇内容全是知识,没有水分,愿陪伴大家一起成长,一起进步...