这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
背景
学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。
问题
['1', '2', '3'].map(parseInt) what & why?
这种题,第一眼看上去,parseInt这是个什么鬼,还可以这么写?
仔细思考以后,我们只需要了解API就可以了,这题没有什么难度,map接受一个方法,而parseInt正好是一个方法,我们只需要了解具体的参数即可,不要被面试题给吓到。
我们可以看到map接受一个callback,这个方法有三个参数,当前元素,当前元素索引,当前元素的数组。
我们再看一看parseInt方法参数。
这里第一个参数是需要被转换的字符串,第二个参数是数字的基数,这里一般是2,4,8,10,16,32, 并且每种进制表示的数字都是不一样的,我们常见的数字(1,2,3,4,5,8)都属于10进制。
那我们将方法带入:
['1', '2', '3'].map((curValue,index,arr)=>{
//这里是索引
return parseInt(curValue,index);
});
parseInt("1",0) // 1
parseInt("2",1) // NAN
parseInt("3",2) // NAN
大家是不是以为自己已经懂了,再看看下一道题
['10', '10', '10','10', '10'].map(parseInt)
看到了吗? parseInt("10",2),这块就涉及到计算机的专业知识了。
面试官应该考的是你对API的掌握程度,我认为到这里其实应该可以打住了。在深层的转换我们只需要了解概念,至于转换,交给计算机就行。
什么是防抖和节流?有什么区别?如何实现?
防抖:动作绑定事件,动作发生一段时间后触发,如果在这段时间内,动作继续触发,则重新计算时间。
节流:动作绑定事件,动作发生一段事件后触发,这个时间段是固定的,在这个时间端内只触发一次事件(数据节流)。
代码实现:
//防抖debounce代码:
function debounce(fn) {
let timeout = null; // 创建一个标记用来存放定时器的返回值
return function () {
// 每当用户输入的时候把前一个 setTimeout clear 掉
clearTimeout(timeout);
// 然后又创建一个新的 setTimeout, 这样就能保证interval 间隔内如果时间持续触发,就不会执行 fn 函数
timeout = setTimeout(() => {
fn.apply(this, arguments);
}, 500);
};
}
// 处理函数
function handleFun() {
console.log(Math.random());
}
// 滚动事件
window.addEventListener('scroll', debounce(handleFun));
//节流throttle代码:
function throttle(fn) {
let canRun = true; // 通过闭包保存一个标记
return function () {
// 在函数开头判断标记是否为true,不为true则return
if (!canRun) return;
// 立即设置为false
canRun = false;
// 将外部传入的函数的执行放在setTimeout中
setTimeout(() => {
// 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。
// 当定时器没有执行的时候标记永远是false,在开头被return掉
fn.apply(this, arguments);
canRun = true;
}, 500);
};
}
function print(e) {
console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener('resize', throttle(print));
结语
一步一步慢慢来,踏踏实实把活干!