当前位置: 首页 > news >正文

前端面试常见手写代码题【详细篇】

文章目录

    • 前言:
    • 防抖
    • 节流
    • 函数柯里化
    • 函数组合
    • instanceof 实现
    • 实现new操作符的行为
    • 深拷贝
    • 继承实现:
    • 手写Promise
    • 数组中常见函数的实现

前言:

在前端面试中,经常会遇到要求手写的代码的题目,主要是考察我们的编程能力、和对JavaScript的理解以及对前端最佳实践的掌握。下面是我整理了一些常见的手写代码题目,您可以看看自己能实现哪些。。

防抖

防抖函数,确保一段时间内多次触发事件只执行一次。

// --- 基础版
function debounce(fn, delay) {let timer = 0;return (e) => {if (timer) {clearTimeout(timer);}timer = setTimeout(() => fn(e), delay);};
}
let deboundceCli = debounce((e) => console.log(e), 500);
document.body.addEventListener("click", function () {deboundceCli("执行了。");
});
// ---立即执行版
function debounceImmediate(fn, delay, immediate) {let timer = null;return (...rest) => {if (timer) {clearTimeout(timer);}// 立即执行if (immediate) {let exec = !timer;timer = setTimeout(() => (timer = null), delay);if (exec) {fn(...rest);}} else {timer = setTimeout(() => fn(...rest), delay);}};
}let deboundceCli = debounceImmediate((e) => console.log(e), 500, true);
document.body.addEventListener("click", function () {deboundceCli("执行了。");
});

节流

节流函数,确保在指定时间内只执行一次。

const throttle = (fn, delay) => {let lastTimer = null;return (e) => {if (Date.now() - lastTimer > delay) {lastTimer = Date.now();fn(e);}};
};
let throttleCli = throttle((e) => console.log(e), 1000);
window.document.addEventListener("scroll", function () {throttleCli("执行了。。 ");
});

函数柯里化

能够接受多个参数,并返回一个新的函数。

// ---柯里化
const curry = (fn) => {return function inner() {let len = arguments.length;if (len === fn.length) {// 执行return fn(...arguments);} else {// 返回一个函数return (...res) => inner(...[...arguments, ...res]);}};
};const f1 = (a, b, c) => a * b * c;let cy = curry(f1);
console.log(cy(2)(3, 4)); // 24

函数组合

接受多个函数,返回新的函数,执行结果是从右向左执行

// ---- 函数组合---  从右向左执行
const group = (...rest) => {return (val) => {return [...rest].reduceRight((item, res) => {return res(item);}, val);};
};const f1 = (val) => val + 5;
const f2 = (val) => val * 10;let res = group(f1,f2)
console.log(res(10));  // 105: (10*10) + 5

instanceof 实现

根据原型链向上查找,如果找到null都还没找到,就返回false, 找到就返回 true

const my_instanceof = (instance, obj) => {let proto = instance.__proto__;while (proto) {if (proto.constructor.name === obj.name) return true;proto = proto.__proto__;}return false;
};let a = [];console.log("instanceOf 结果:", my_instanceof(a, Array));

实现new操作符的行为

function myNew(fn, ...args) {// 1. 创建一个空对象let obj = Object.create(fn.prototype);// 2. 调用构造函数,绑定this,并传入参数let result = fn.apply(obj, args);// 3. 如果构造函数返回了一个新的对象,则返回该对象;否则返回步骤1创建的对象return result instanceof Object ? result : obj;
}

深拷贝

处理基本数据类型,对象、数组以及其中的嵌套结构


function deepClone(obj) {// 如果是基本数据类型或null,则直接返回if (obj === null || typeof obj !== "object") {return obj;}// 如果是日期对象,则创建一个新的日期对象if (obj instanceof Date) {return new Date(obj);}// 如果是正则对象,则创建一个新的正则对象if (obj instanceof RegExp) {return new RegExp(obj);}// 创建一个新对象或数组,并存储在WeakMap中const cloneObj = new obj.constructor();// 递归拷贝原对象的每个属性for (let key in obj) {if (obj.hasOwnProperty(key)) {// 忽略原型链上的属性cloneObj[key] = deepClone(obj[key]);}}return cloneObj;
}

继承实现:

  • 5种JS原型继承方式总结,你了解几种?

手写Promise

  • 手写Promise 一、二

数组中常见函数的实现

在 JavaScript 中,数组的函数式方法非常强大,它们允许你以声明式的方式处理数组数据.

设置全局变量numbers

const numbers = [1, 2, 3];
  1. map
    map 方法创建一个新数组,其结果是该数组中的每个元素都调用一次提供的函数后的返回值。

    Array.prototype.myMap = function (callback) {const newArray = [];for (let i = 0; i < this.length; i++) {newArray.push(callback(this[i], i, this));}return newArray;
    };const squares = numbers.myMap((number) => number * number);
    console.log(squares); // 输出 [1, 4, 9]
    
  2. filter
    filter 方法创建一个新数组,其包含通过所提供函数实现的测试的所有元素。

    Array.prototype.myFilter = function (callback) {const newArray = [];for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {newArray.push(this[i]);}}return newArray;
    };const evens = numbers.myFilter((number) => number % 2 === 0);
    console.log(evens); // 输出 [2]
    
  3. reduce
    reduce 方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值,需要处理默认值

    Array.prototype.myReduce = function (callback, initialValue) {let accumulator = initialValue !== undefined ? initialValue : this[0];for (let i = initialValue !== undefined ? 0 : 1; i < this.length; i++) {accumulator = callback(accumulator, this[i], i, this);}return accumulator;
    };const sum = numbers.myReduce((accumulator, currentValue) => accumulator + currentValue
    );
    console.log(sum); // 输出 6
    
  4. forEach
    forEach 方法对数组的每个元素执行一次提供的函数。

    Array.prototype.myForEach = function (callback) {for (let i = 0; i < this.length; i++) {callback(this[i], i, this);}
    };numbers.myForEach((number) => console.log(number));
    // 输出:
    // 1
    // 2
    // 3
    
  5. find
    find 方法返回数组中满足提供的测试函数的第一个元素的值。否则返回 undefined。

    Array.prototype.myFind = function (callback) {for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {return this[i];}}return undefined;
    };const found = numbers.myFind((number) => number > 1);
    console.log(found); // 输出 2
    
  6. every
    every 方法测试所有元素是否都通过了测试函数。如果都通过,则返回 true;否则返回 false。

    Array.prototype.myEvery = function (callback) {for (let i = 0; i < this.length; i++) {if (!callback(this[i], i, this)) {return false;}}return true;
    };const allAreNumbers = numbers.myEvery((element) => typeof element === "number"
    );
    console.log(allAreNumbers); // 输出 true
    
  7. some
    some 方法测试数组中是不是至少有一个元素通过了被提供的函数测试。如果是,立即返回 true;否则返回 false。

    Array.prototype.mySome = function (callback) {for (let i = 0; i < this.length; i++) {if (callback(this[i], i, this)) {return true;}}return false;
    };const anyAreEven = numbers.mySome((number) => number % 2 === 0);
    console.log(anyAreEven); // 输出 true
    
  8. flat
    flat 方法将嵌套的数组“拍平”,拍平的层级取决于输入的deep 深度

递归实现:

const flat = (arr, deep = 0) => {let result = [];if (deep === 0) return arr;arr.forEach((item) => {if (item instanceof Array) { result = result.concat(flat(item, deep - 1));} else {result = result.concat(item);}});return result;
};console.log(flat([1, 2, [3, 4, [5, 6]]], 1)); // [ 1, 2, 3, 4, [ 5, 6 ] ]
console.log(flat([1, 2, [3, 4, [5, 6]]], 2)); // [ 1, 2, 3, 4, 5, 6 ]
Array.prototype.myFlat = function (depth = 1) {if (depth === 0) return this;return this.reduce((acc, val) => {return acc.concat(Array.isArray(val) ? val.myFlat(depth - 1) : val);}, []);
};const nestedArray = [1, [2, 3, [2, 4, [5]]]];
const flatArray = nestedArray.myFlat(2);
console.log(flatArray); // 输出 [1, 2, 3, 2, 4, Array(1)]
  1. reduceRight
    reduceRight 方法对数组中的每个元素执行一个由您提供的 reducer 函数(从右到左执行),将其结果汇总为单个返回值。需要处理默认值

    Array.prototype.myReduceRight = function (callback, initialValue) {let accumulator =initialValue !== undefined ? initialValue : this[this.length - 1];let start = initialValue !== undefined ? this.length - 1 : this.length - 2;for (let i = start; i >= 0; i--) {accumulator = callback(accumulator, this[i], i, this);}return accumulator;
    };const rightSum = numbers.myReduceRight((accumulator, currentValue) => accumulator + currentValue
    );
    console.log(rightSum); // 输出 6
    

相关文章:

前端面试常见手写代码题【详细篇】

文章目录 前言&#xff1a;防抖节流函数柯里化函数组合instanceof 实现实现new操作符的行为深拷贝继承实现&#xff1a;手写Promise数组中常见函数的实现 前言&#xff1a; 在前端面试中&#xff0c;经常会遇到要求手写的代码的题目&#xff0c;主要是考察我们的编程能力、和对…...

当代最厉害的哲学家改名大师颜廷利:北京、上海、广州和深圳房价精准预测

在2024年国庆节期间&#xff0c;北京、上海、广州和深圳的房地产市场异常活跃。作为山东济南籍的国际易学权威颜廷利教授&#xff0c;连续收到了这些大城市客户的感谢信和电话。 来自北京的王先生在信中写道&#xff1a;“非常感谢颜廷利教授这几年来对我们的鼓励和支持。在经历…...

MySQL常用指令码

本文精心挑选了一系列MySQL指令码&#xff0c;助你提升资料库效率、解决常见问题&#xff0c;让你的资料储存体验更加高效、可靠。 常用功能指令码 1.汇出整个资料库 mysqldump - u 使用者名称- p – default - character - set latin1 资料库名>汇出的档名(资料库预设编…...

OpenHarmony(鸿蒙南向开发)——轻量系统内核(LiteOS-M)【扩展组件】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… C支持 基本概念 C作为目前使用最广泛的编程语言之一&#xff0c;…...

官方ROM 免费下载! 王者归来! 华为秘盒media Q M310(续)

最近在捣鼓电视盒子&#xff0c; 前帖讨论了如何拯救华为华为秘盒media Q M310&#xff0c; 详情请点击这里&#xff01; https://blog.csdn.net/weixin_62598385/article/details/142658048 CSDN上有精简版的M310 ROM下载&#xff0c; 但是我点不进去&#xff0c; 要收年费&am…...

【Docker】05-Docker部署前端项目

1. nginx.conf worker_processes 1;events {worker_connections 1024; }http {include mime.types;default_type application/json;sendfile on;keepalive_timeout 65;server {listen 18080;# 指定前端项目所在的位置location / {root /usr/share/nginx…...

SQL进阶技巧:如何优化NULL值引发的数据倾斜问题?

目录 0 场景描述 1 问题分析 1.1 问题剖析 1.2 解决方案 2 小结 0 场景描述 实际业务中有些大量的null值或者一些无意义的数据参与到计算作业中,表中有大量的null值,如果表之间进行join操作,就会有shuffle产生,这样所有的null值都会被分配到一个reduce中,必然产生数…...

【09】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-Class类基础全解(属性、方法、继承复用、判断)

序言&#xff1a; 本文详细讲解了关于我们在程序设计中所用到的class类的各种参数及语法。 笔者也是跟着B站黑马的课程一步步学习&#xff0c;学习的过程中添加部分自己的想法整理为笔记分享出来&#xff0c;如有代码错误或笔误&#xff0c;欢迎指正。 B站黑马的课程链接&am…...

快速提升波段交易技能:4种实用策略分享

每个交易员的交易偏好是各不相同的&#xff0c;有人偏爱短线交易的迅速反应&#xff0c;有人钟情于中长线的稳健布局&#xff0c;还有人则热衷于波段交易的灵活操作。我们经常探讨短线与中长线的策略&#xff0c;但你了解波段交易的策略吗&#xff1f; 波段交易是什么&#xf…...

LeetCode 11 Container with Most Water 解题思路和python代码

题目&#xff1a; You are given an integer array height of length n. There are n vertical lines drawn such that the two endpoints of the ith line are (i, 0) and (i, height[i]). Find two lines that together with the x-axis form a container, such that the co…...

【深度学习】损失函数

损失函数&#xff08;Loss Function&#xff09;是机器学习和深度学习模型中的一个核心概念&#xff0c;它用于衡量模型的预测输出与真实标签之间的差异。通过优化&#xff08;最小化&#xff09;损失函数&#xff0c;模型可以不断调整其内部参数&#xff0c;提升预测性能。不同…...

力扣 中等 46.全排列

文章目录 题目介绍题解 题目介绍 题解 代码如下&#xff1a; class Solution {List<List<Integer>> res new ArrayList<>();// 存放符合条件结果的集合List<Integer> path new ArrayList<>();// 用来存放符合条件结果boolean[] used; // 标记…...

LabVIEW机床加工监控系统

随着制造业的快速发展&#xff0c;机床加工的效率与稳定性成为企业核心竞争力的关键。传统的机床监控方式存在效率低、无法远程监控的问题。为了解决这些问题&#xff0c;开发了一种基于LabVIEW的机床加工监控系统&#xff0c;通过实时监控机床状态&#xff0c;改进生产流程&am…...

第五届智能设计国际会议(ICID 2024)

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年10月25-27日大会地点&#xff1…...

厨房用品分割系统源码&数据集分享

厨房用品分割系统源码&#xff06;数据集分享 [yolov8-seg-C2f-DCNV3&#xff06;yolov8-seg-AFPN-P345等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global Al ln…...

【HTTPS】深入解析 https

我的主页&#xff1a;2的n次方_ 1. 背景介绍 在使用 http 协议的时候是不安全的&#xff0c;可能会出现运营商劫持等安全问题&#xff0c;运营商通过劫持 http 流量&#xff0c;篡改返回的网页内容&#xff0c;例如广告业务&#xff0c;可能会通过 Referer 字段 来统计是…...

Axios 快速入门

什么是Ajax Ajax 是一种通过 JavaScript 发送异步请求的技术&#xff0c;它的核心是使用 XMLHttpRequest 对象来与服务器交换数据。这种方式较为繁琐&#xff0c;因为需要手动处理请求状态和响应&#xff0c;并且编写的代码往往比较冗长。 相较之下&#xff0c;Axios 是一个基于…...

LabVIEW提高开发效率技巧----调度器设计模式

在LabVIEW开发中&#xff0c;针对多任务并行的需求&#xff0c;使用调度器设计模式&#xff08;Scheduler Pattern&#xff09;可以有效地管理多个任务&#xff0c;确保它们根据优先级或时间间隔合理执行。这种模式在需要多任务并发执行时特别有用&#xff0c;尤其是在实时系统…...

python之认识变量

1、变量 1.1、定义 字面意思来看&#xff0c;会发生改变的量称为变量。 相反的&#xff0c;如果有一个不会发生改变的量&#xff0c;它应该称为不变量&#xff0c;即常量。 1.2、引入变量的原因 主要是为了方便程序员动态的管理、操控数据。 1.3、变量的三要素 名称 类型…...

c++应用网络编程之十Linux下的Poll模式

一、Poll模式 在上一篇文章中提到了Select模式的缺点。既然有缺点&#xff0c;就要改正。但是直接在Select模式上修改不太现实&#xff0c;那么就推出一个新的模式不更香么&#xff1f;poll模式就应运而生了。不过&#xff0c;罗马不是一天建成的&#xff0c;poll模式也只是对…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...