['1', '2', '3'].map(parseInt) what & why?

155 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

背景

学习前端三个月了,准备刷刷面试题,总结总结,一天几道面试题,向大厂进军。

问题

['1', '2', '3'].map(parseInt) what & why?

这种题,第一眼看上去,parseInt这是个什么鬼,还可以这么写?

仔细思考以后,我们只需要了解API就可以了,这题没有什么难度,map接受一个方法,而parseInt正好是一个方法,我们只需要了解具体的参数即可,不要被面试题给吓到。

image.png

我们可以看到map接受一个callback,这个方法有三个参数,当前元素,当前元素索引,当前元素的数组。

我们再看一看parseInt方法参数。

image.png

这里第一个参数是需要被转换的字符串,第二个参数是数字的基数,这里一般是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)
 

image.png

看到了吗? 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));

结语

一步一步慢慢来,踏踏实实把活干!