前端面试代码题

本文总结面试过程中遇到的代码题。

1. 变量提升

2. 数组相关的方法

注意返回true值是保留不是过滤,别记反。没啥,就是gap半年在面不写会忘的。。。

arr.filter((item, index, current) => {return arr.indexOf(item) == index});。可以去重

filter本质还是建了一个新的数组,回调函数里返回true则保留。上面一行代码表示重复的只往里面放第一次。

双指针去重:

使用双指针去重排序好的数组,相等的话fast指针右移一位,不相等的话slow右移一位,将fast位置的值保存,fast右移一位比较下一次:

function doublePointer(nums) {
    if(nums.length < 2) {
        return nums;
    }
    let slow = 0;
    let fast = 1;
    let result = [nums[0]];
    while(fast < nums.length) {
        if (result[slow] == nums[fast]) {
            fast++;
        } else {
            slow++;
            result[slow] = nums[fast];
            fast++;
        }
    }
    return result;
}
const arr = [1,1,2,2,4,4];
console.log(doublePointer(arr));

输入[1,1,2,2,4,4]输出[1,2,4]。

如果数组是个对象:

const arr2 = [{id:1,time: 2},{id:1,time: 4},{id:2,time: 2},{id:2,time: 4},{id:3,time: 5},

{id:3,time: 2}];

 现在需要根据id去重,id相等的情况下,只保留time最大的对象,输出:

[ { id: 1, time: 4 }, { id: 2, time: 4 }, { id: 3, time: 5 } ]

function doublePointerByorder(nums) {
    if(nums.length < 2) {
        return nums;
    }
    let slow = 0;
    let fast = 1;
    let result = [nums[0]];
    while(fast < nums.length) {
        if (result[slow].id == nums[fast].id) {
            if(result[slow].time < nums[fast].time) {
                result[slow] = nums[fast];
            }
            fast++;
        } else {
            slow++;
            result[slow] = nums[fast];
            fast++;
        }
    }
    return result;
}

console.log(doublePointerByorder(arr2));即可。

当然这里可以使用空对象去记,每次取对象里id对应的那个time比较,选择是否覆盖。遍历完使用for in循环将对象转数组。

3. 引用相关

引用类型变量的等于号赋值,不会相互影响。

但是通过a.b的方式会影响,此时算浅复制,如下所示。

person1 = {name: 3};
members = person1;
members.name = 4;   // person1.name=4

3. 宏任务微任务

2 4 5同步代码,3微任务,1宏任务。唯一的坑就是4会打印,return 3就不会执行 

4. 比较运算符

隐式转换比较时,数组调用了toString方法。

5. 防抖节流手写

自己要写一写,如果看过没写过,面试要手撕,大概率撕不出来。下面分别是:防抖立即执行和延迟执行,节流立即执行和延迟执行

function debounce(fn, delay) {
    let timer = null;
    return function (...args) {
        timer && clearTimeout(timer);
        timer = setTimeout(() => {
            fn.apply(this, args);
        }, delay);
    }
}

function debounce_immediate(fn, delay, immediate = false) {
    let timer = null;
    let flag = true;
    return function (...args) {
        timer && clearTimeout(timer);
        if (immediate) {
            if (flag) {
                fn.apply(this, args);
                flag = false;
            }
            timer = setTimeout(() => {
                flag = true;
            }, delay);

        } else {
            timer = setTimeout(() => {
                fn.apply(this, args);
            }, delay);
        }
    }
}

function throttle(fn, delay) {
    let lastTime = 0;
    let timer = null;
    return function (...args) {
        const nowTime = Date.now();
        if (nowTime - lastTime > delay) {
            fn.apply(this, args);
            lastTime = nowTime;
        }
    }
}

function throttle_D(func, delayTime) {
    let delay = delayTime || 1000;
    let timer = null;
    return function (...args) {
        if (!timer) {
            timer = setTimeout(function () {
                func.apply(this, args);
                timer = null;
            }, delay);
        }
    }
}

记得带上args,防抖和节流本质的区别是防抖一直在重置定时器,节流不是的,节流一直触发的话在一定时间间隔内都会执行且只执行一次。防抖如果一直触发个一分钟,那也只会执行一次(立即执行或者最后一次点击时触发延迟执行)。

相关推荐

  1. 前端工程化面试

    2024-07-11 08:46:05       41 阅读
  2. 前端基础面试

    2024-07-11 08:46:05       40 阅读
  3. 前端nodead面试

    2024-07-11 08:46:05       28 阅读
  4. 前端面试

    2024-07-11 08:46:05       31 阅读
  5. 前端高频面试

    2024-07-11 08:46:05       25 阅读
  6. web前端面向对象面试25

    2024-07-11 08:46:05       18 阅读
  7. 前端React基础面试

    2024-07-11 08:46:05       55 阅读
  8. 2023 前端实战面试

    2024-07-11 08:46:05       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 08:46:05       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 08:46:05       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 08:46:05       57 阅读
  4. Python语言-面向对象

    2024-07-11 08:46:05       68 阅读

热门阅读

  1. 第10章:Electron应用打包与分发

    2024-07-11 08:46:05       17 阅读
  2. PostgreSQL 数据库监控项

    2024-07-11 08:46:05       23 阅读
  3. MYSQl命令总结:1.数据类型、数据库、表、约束

    2024-07-11 08:46:05       23 阅读
  4. 1703:发现它,抓住它

    2024-07-11 08:46:05       19 阅读
  5. 2019年美赛题目Problem A: Game of Ecology

    2024-07-11 08:46:05       21 阅读
  6. 手撸俄罗斯方块(三)——游戏核心模块设计

    2024-07-11 08:46:05       17 阅读
  7. API 类别 - 选择器

    2024-07-11 08:46:05       23 阅读
  8. 画布与印章C++

    2024-07-11 08:46:05       21 阅读
  9. mybatis动态SQL常用语法总结

    2024-07-11 08:46:05       22 阅读