前端面试 - 常考的手撕代码题

前端常见手撕题(详细注释版):持续更新中…… 基本思路和浅拷贝一样,不同的是在拷贝时,如果遇到复杂数据类型,就要递归调用(再生成一个新的地址,把简单数据类型捞过来,返回新的地址,给到当前key),这样可以保证只要遇到复杂数据类型,都可以生成新的地址。写法2:获取时间戳,第一次肯定会触发,因为new Date获取的是从1970年到现在的时间,delay总不能大于五十年吧……返回一个函数,调用这个函数的时候就调用myBind的调用者,并改变this。第一个参数是构造函数,第二个参数是实例化时的参数。//4.事件绑定,处理服务端返回的结果。 阅读详情

1. 各种排序+查找算法


冒泡排序 快速排序 归并排序 插入排序 选择排序 顺序查找 二分查找 [https://blog.youkuaiyun.com/Sabrina_cc/article/details/106857519](()

2. call bind apply


apply 、 call 、bind 三者都是用来改变函数的this对象的指向的;第一个参数都是this要指向的对象,也就是想指定的上下文;

call() 方法在使用一个指定的 this 值和若干个指定的参数值的前提下调用某个函数或方法。

所以我们模拟的步骤可以分为:(1)将函数设为对象的属性(2)执行该函数(3)删除该函数

Function.prototype.myCall = function(context) {

/*if (typeof this !== ‘function’) {

throw new TypeError(‘Error’)

}*/

context = context || window; //第一个参数为null或者undefined时,this指向全局对象window

context.fn = this; // 非常关键:改变 this 的作用域

const args = […arguments].slice(1); //从 Arguments 对象中取取第二到最后一个参数放到一个数组里

const result = context.fn(…args); //把这个参数数组放到要执行的函数的参数里面去

delete context.fn; // 必须删除,会给 context 增加方法 fn

return result;

}

// 简单测试

let obj = {

name: ‘xxx’

};

function test(){

console.log(‘arguments=’,arguments); // Arguments(2) [1, 2, callee: ƒ, Symbol(Symbol.iterator): ƒ]

console.log(‘this=’,this); // {name: “xxx”, fn: ƒ}

}

test.myCall(obj,1,2);

apply 接受一个数组(或者类数组对象)作为参数输入

Function.prototype.myApply = function(context) {

/* if (typeof this !== ‘function’) {

throw new TypeError(‘Error’)

}*/

context = context || window;

context.fn = this;

let result;

if (arguments[1]) {

result = context.fn(…arguments[1]); // 处理参数和 call 有区别

} else {

result = context.fn();

}

delete context.fn;

return result;

}

let foo = {

value: 1

}

function bar(name, age) {

console.log(name)

console.log(age)

console.log(this.value)

}

bar.apply(foo, [‘kevin’, 18]) // kevin 18 1

会创建一个新函数。当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this,之后的一序列参数将会在传递的实参前传入作为它的参数。(来自于 MDN )

由此我们可以首先得出 bind 函数的两个特点:(1)返回一个函数(2)可以传入参数(3)一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

Function.prototype.bind 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 = function(context, …bindArgs) {

const func = this;// func 为调用 bind 的原函数

context = context || window;

if (typeof func !== ‘function’) {

throw new TypeError(‘Bind must be called on a function’);

}

// bind 返回一个绑定 this 的函数

return function(…callArgs) {

let args = bindArgs.concat(callArgs);

if (this instanceof func) {

// 意味着是通过 new 调用的 而 new 的优先级高于 bind

return new func(…args);

}

return func.call(context, …args);

}

}

参考链接:[JavaScript 之 call和apply,bind 的模拟实现](()

[深入理解 call,apply 和 bind](()

[apply、call和 bind 方法详解(含手写)](()

3. 深拷贝


function deepClone(obj = {}) {

if (typeof obj !== ‘object’ || obj == null) {

return obj // obj 是 null ,或者不是对象和数组,直接返回

}

let result // 初始化返回结果

if (obj instanceof Array) {    // 判断是否为数组

result = []

} else {

result = {}

}

for (let key in obj) {

if (obj.hasOwnProperty(key)) { // 保证 key 不是原型的属性

result[key] = deepClone(obj[key]) // 递归调用!!!

}

}

return result    // 返回结果

}

let a = {

age: undefined,

sex: Symbol(‘male’),

jobs: function () {},

name: ‘cmk’

}

let b = JSON.parse(JSON.stringify(a))

console.log(b) // { name: ‘cmk’ }

let c = deepClone(a)

console.log© // { age: undefined, sex: Symbol(male), jobs: [Function: jobs], name: ‘cmk’ }

4. 防抖 节流


scroll 事件本身会触发页面的重新渲染,同时 scroll 事件的 handler 又会被高频度的触发, 因此事件的 handler 内部不应该有复杂操作,例如 DOM 操作就不应该放在事件处理中。 针对此类高频度触发事件问题(例如页面 scroll ,屏幕 resize,监听用户输入等),有两种常用的解决方法,防抖和节流。

Function.prototype.myThrottle = function(cb, wait) {

let flag = false;

return function(…rest) {

if (flag) {

return;

}

flag = true;// 在wait时间范围内。。通过flag不让执行cb;

setTimeout(() => {

cb.apply(this, rest);

flag = false;

}, wait)

}

}

Function.prototype.myDebounce = function(cb, wait) {

let timer = null;

return function (…rest) {

if (timer) {

// 如果上次的定时器还存在,则清除。重新等待时间

clearTimeour(timer);

}

timer = setTimeout(() => {// 使用箭头函数,确保this还能定义在当前执行环境

// 里边的闭包的this必须保持和callback保持一致。确保使用ok

cb.apply(this, rest);

}, wait)

}

}

6. 字符串转驼峰


// 字符串转驼峰,注意第一个字符不大写,如border-bottom-color -> borderBottomColor

function Change(str) {

let arr = str.split(‘-’) // 字符串分割为数组

// map返回由新的项组成的数组

arr = arr.map((item, index) => {

return index === 0 ? item : item.charAt(0).toUpperCase() + item.substring(1) // 第一个字符转大写与之后的字符合并

})

return arr.join(“”) // 数组合并为字符串

}

console.log(Change(‘border-bottom-color’))

7. 数组拍平


function flat(arr) {

// 验证 arr 中,还有没有深层数组 [1, 2, [3, 4]]

const isDeep = arr.some(item => item instanceof Array)

if (!isDeep) {

return arr // 已经是 flatern [1, 2, 3, 4]

}

// oncat只能解决单层[]

const res = Array.prototype.concat.apply([], arr)

return flat(res) // 递归

}

const res = flat( [1, 2, [3, 4, [10, 20, [100, 200]]], 5] )

console.log(res)

function flattern(arr) {

return arr.reduce((preValue, currValue, currIndex, array) => {

return preValue.concat(Array.isArray(currValue) ? flattern(currValue) : currValue)

}, []) // []作为第一个preValue

}

// toString & split

function flattern2(arr) {

return arr.toString().split(‘,’).map(item => {

return Number(item) // split分隔后数组元素为字符串形式, 需要转换为数值形式

})

}

// join & split

function flattern3(arr) {

return arr.join(‘,’).split(‘,’).map(item => { // join方法和toString方法效果一样?

return parseInt(item)

})

}

// 扩展运算符

function flattern5(arr) {

while (arr.some(item => Array.isArray(item))) { // 如果数组元素中有数组

arr = [].concat(…arr) // [].concat(…[1, 2, 3, [4, 5]]) 扩展运算符可以将二维数组变为一维的

}

return arr

}

8. 数组去重


// 传统方式

function unique(arr) {

const res = []

arr.forEach(item => {

if (res.indexOf(item) < 0) { // 没有当前元素

res.push(item)

}

})

return res

}

// 使用 Set (无序,不能重复)

function unique(arr) {

const set = new Set(arr)

return […set] // 解构

}

const res = unique([30, 10, 20, 30, 40, 10])

console.log(res)

9. 函数柯里化


在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。函数柯里化的主要作用和特点就是参数复用、提前返回和延迟执行。

function curry(fn, args) {

var length = fn.length;

var args = args || [];

return function(){

newArgs = args.concat(Array.prototype.slice.call(arguments));

if (newArgs.length < length) {

return curry.call(this,fn,newArgs);

}else{

return fn.apply(this,newArgs);

}

}

}

function multiFn(a, b, c) {

return a * b * c;

}

var multi = curry(multiFn);

multi(2)(3)(4);

multi(2,3,4);

multi(2)(3,4);

multi(2,3)(4);

10. 实现jQuery


class jQuery {

算法面试必备-----手撕代码高频题 算法面试必备-----手撕代码高频题算法面试必备-----手撕代码高频题字节跳动阶乘末尾0的个数判断一颗二叉树是否为镜像对称 算法面试必备-----手撕代码高频题 字节跳动 阶乘末尾0的个数 输入描述: 输入为一行,n(1 ≤ n ≤ 1000) 输出描述: 输出一个整数,即题目所求 解法:要判断末尾有几个0就是判断可以整除几次10。10的因子有5和2,而在0~9之间5的倍数只有一个,2的倍数相对较多,所以本题也就转换成了求N阶乘中有几个5的倍数。 也就是每多出来一个5,阶乘末尾就会多出来一个0,这样n / 阅读详情

相关推荐

2024年最新【总结】:大厂面试常考手撕代码 —— JavaScript排序算法,2024年最新轻松面试问题

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

2301_82244330的博客 844

bind原理及模拟实现

前言 如果不了解bind的使用的请前往 Function.prototype.bind,这里不在赘述。 想要看bind原理的童鞋,需要对以下知识有了解: 闭包 原型链 this的指向 Array.prototype.slice new的过程 Object.create 思路 bind方法不会立即执行函数,而且需要保存一个入参,所以这里利用到了 闭包 改变函数的作用域,因此要利用 apply 或者 call方法来实现 获取函数的所有入参arguments,以及使用 slice 转化出一个数组 先利用上

haonan_z的博客 1084

前端面试之JavaScript篇

之前准备面试的时候整理的,希望能带给大家一点帮助~ 目录js为什么是单线程,有什么好处?js异步加载的方式Microtasks、Macrotasks(事件循环event loop、任务队列task queues)原型和原型链构造函数、原型、实例的关系new的基本原理(当let fun = new Fun()时发生了什么?)继承prototype和__proto__的关系typeof和instanc...

BIGDgreen 1571

各种源码实现,你想要的这里都有

阅读源码的好处,不用说都知道,首先进大厂必备,还可以提升自己的能力,学习前人的经验。源码往往是前人留下的最佳实践,我们跟着前人的脚步去学习会让我们事半功倍。 call、aplly、bind 实现 new 实现 class 实现继承 async/await 实现 reduce 实现 实现一个双向数据绑定 instanceof 实现 Array.isArray 实现 Object.create ...

weixin_45189747的博客 445

游戏资源解包神器NSCB实战:手把手教你提取Switch游戏视频(nsm转MP4)

本文详细介绍了如何使用NSCB工具链从Switch游戏中提取nsm视频和hca音频资源,并将其转换为可编辑的MP4和MP3格式。通过NSC Builder、CriPakTools等工具的分步操作指南,帮助内容创作者高效获取游戏资源,同时提供音视频同步合成、批量处理等高级技巧,为创意素材制作提供完整解决方案。

weixin_29197835的博客 894

若依框架(ruoyi vue版)集成jeecg积木报表整体完整实用教程(超长篇幅耐心阅读)

若依框架(ruoyi vue版)集成jeecg积木报表整体完整实用教程,主要说明jeecg积木报表的集成、jeecg积木报表嵌入若依菜单、token权限控制,以及iframe嵌入表格等内容。

weixin_53067723的博客 4643

JavaScript bind() 方法的实现

bind() 方法的特点 bind() 方法会创建一个新函数。 当这个新函数被调用时,bind() 的第一个参数将作为它运行时的 this, 可以把除了第一个参数以外的其他参数都传递给下层的函数(这种技术称为“部分应用”,是“柯里化”的一种)注① 如果 bind() 返回的函数 作为构造函数使用,bind 时指定的 this 值会失效,但传入的参数有效。 new 调用返回的实例能够继承 绑定...

Beijiyang 1623

反无人机作战体系全解析:从低慢小探测到分层拦截

随着小型无人机在军事和民用领域的广泛使用,低慢小目标探测与拦截成为低空安全的核心挑战。传统防空体系面对成本低廉、飞行高度低、雷达特征小的无人机集群时,暴露出探测难、识别难、处置成本失衡等问题。为应对威胁,反无人机体系采用分层闭环设计,融合雷达、光电、声学与无线电侦测实现多源感知,通过电子战软杀伤与导弹、高炮、激光等硬杀伤手段协同配合,并借助自动化指控系统缩短“传感器到射手”的响应时延。该体系既可支撑战场要地防护,也能为民用低空安防提供参考。围绕分层反制逻辑,梳理探测、软硬杀伤、指控布防及实战短板,提供理解反

weixin_42533120的博客 334

前端面试 - 常考的手撕代码题(1),最新阿里P7技术体系

疯狂编程学习效果可视化写博客阅读优秀代码心态调整2547855)][外链图片转存中…(img-71zDzv0q-1712072547856)]

2301_79099287的博客 1284

基于matlab版本的三维直流电法反演算法

可以使用RESINVM3D工具包等现成的MATLAB工具进行三维直流电法反演。反演问题求解:基于MATLAB的反演问题求解算法实现和应用,包括反演问题数值模拟、反演问题参数优化和反演问题结果分析。希望这个代码示例能帮助你入门三维直流电法反演。如果有更具体的需求或问题,可以进一步探讨。反演过程中可能需要调整正则化参数和优化算法的设置。需要根据实际问题实现,可能涉及复杂的数值计算。

ytttr873的博客 669

从D3 00到FF FF:手把手解析RTCM3.2协议帧结构(附Python解析代码)

本文深入解析RTCM3.2协议帧结构,从同步头标识到CRC校验算法,详细讲解如何通过Python代码实现二进制数据解析。文章包含完整的RTCM3.2解析器实现,涵盖消息类型解码、CRC校验等关键步骤,并附赠特定消息类型(如1005型基准站坐标)的解析示例,帮助开发者快速掌握GNSS差分数据传输协议的核心技术。

weixin_42550052的博客 354

阿里hr面试常问的问题,前端面试 - 常考的手撕代码题,阿里最爱考的前端面试题

小编的一位同事在校期间连续三年参加ACM-ICPC竞赛。从参赛开始,原计划每天刷一道算法题,实际上每天有时候不止一题,一年最终完成了 600+:凭借三年刷题经验,他在校招中很快拿到了各大公司的offer。入职前,他把他的刷题经验总结成1121页PDF书籍,作为礼物赠送给他的学弟学妹,希望同学们都能在最短时间内掌握校招常见的算法及解题思路。整本书,我仔细看了一遍,作者非常细心地将常见核心算法题和汇总题拆分为4个章节。

2401_83620959的博客 703

学习STM32的无人机控制

设计并实现无人机控制系统,使用STM32单片机进行控制。无人机控制系统主要包括飞行控制、姿态控制、定位导航等功能。以下是一个基于STM32的无人机控制系统的代码案例。以上是一个基于STM32的无人机控制系统的代码案例,包括飞行控制、姿态控制和定位导航等功能。请根据实际情况进行修改和完善。

qq_67153941的博客 839

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

在前端面试中,经常会遇到防抖 、节流、函数柯里化、函数组合、instanceof 实现、实现new操作符的行为、深拷贝、继承实现:、手写Promise、数组中常见函数的实现等代码手写题,本文都已全部列举

前端探索者 3150

redhawk:STA timing data file解析

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?STA timing data file分为以下几个部分:• Header• Name Map• Footer这部分报告设计的基本信息,例如文件类型,设计名称,分隔符等。...

m0_61544122的博客 1156

Xilinx平台SRIO介绍(五)示例工程Example Design介绍

理解IP的使用,少不了Example Design的学习。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

前端面试常考代码题

目录promise实现sleep将AJAX封装成promisepromise快排归并instanceof继承数组去重Set(ES6中最常用)for嵌套for,然后splice去重(ES5中最常用)indexOfsort()利用对象的属性不能相同的特点进行去重(这种数组去重的方法有问题,不建议用)includeshasOwnPropertyfilter递归去重Mapreduce+includes[...new Set(arr)]数组扁平化new、apply、call、bind实现深拷贝、浅拷贝setTimeo

CaraYQ的博客 2142

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

前端秋招面试(1)字节(提前批)一面 + 二面 ,web前端笔试面试题

对于框架原理只能说个大概,真的深入某一部分具体的代码和实现方式就只能写出一个框架,许多细节注意不到。算法方面还是很薄弱,好在面试官都很和蔼可亲,擅长发现人的美哈哈哈…(最好多刷一刷,不然影响你的工资和成功率???在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!

m0_60607675的博客 1133

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

本科生如何准备大模型实习满满干货

最近不少同学问我,怎么准备大模型相关的实习?其实,不用特别纠结于学太多理论,实战项目才是王道!今天就跟大家分享一下我自己的学习路径和项目经验,希望能帮到大家。

2401_85378759的博客 1998

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

前端面试常考代码-js、css

是 JavaScript 中两个常用于并发处理多个异步操作的方法。两者都传入一个数组。promise.all与promise.race的区别。,就立即返回那个结果。

weixin_74439007的博客 351

前端速通面经八股系列(九)—— 全网最全的js输出代码题篇

代码输出结果是面试中常考的题目,一段代码中可能涉及到很多的知识点,这就考察到了应聘者的基础能力。异步编程、事件循环、this指向、作用域、变量提升、闭包、原型、继承等,这些知识点往往不是单独出现的,而是在同一段代码中包含多个知识点。所以,笔者将这些问题大致分为四类进行讨论。这里不会系统的阐述基础知识,而是通过面试例题的形式,来讲述每个题目的知识点以及代码的执行过程。如果会了这些例题,在前端面试中多数代码输出问题就可以轻而易举的解决了。

小庄zzz的博客 1655

Web前端最全前端面试js高频手写大全,2024年最新面试官常问的问题以及巧妙的回答

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】return p12. 手写节流防抖函数防抖:throw new TypeError(‘fn不是函数’)let timer;// 维护一个 timer。

2401_84617131的博客 1198

助力春招:解析15个大厂代码题!

最近跟很多同学沟通了春招的问题,总结了 15 个中大厂中比较常见的代码题(看代码说结果),今天在这里分享给大家。【助(祝)大家可以春招上岸,入职大厂!】

LGD_Sunday的专栏 1154

2018前端面试常考题

前端面试常考题 HTML Canvas/SVG/WebGL HTML 语义化的概念和意义(网站SEO) CSS CSS 盒模型 BFC 块级元素和内联元素 float 和 position 垂直左右居中 CSS3 选择器 重排和重绘 JS 相关 this 闭包 JS 数据类型 深拷贝浅拷贝 对象的属性 原型链 JS 的继承 跨域问题 Promise/async await 事件机制 函...

LeeSirbupt的博客 4177

前端面试日记(7)网易有道

注:在牛客平台投递简历处理很快。约的时间比较靠后。面试时常15min(不知道为啥如此迅速) 1. 自我介绍 2. 项目有哪些难点,如何解决? 3. 前端有哪几种存储方式(session、cookie、localstorage、sessionstorage)区别 4. HTTP协议不同版本有什莫不同 5. HTTP常见状态码 6. 从输入URL到页面加载完成的过程 7. 平时通过什么方法学习,有哪些渠道 题目解析参考链接全在我之前的总结里了《前端面试 - 网络部分总结(总结ing力求完备)》

Sabrina_cc的博客 362
上一篇: 前端提高篇(二十九)JS进阶21常见字符串处理需求及URL编码
下一篇: 前端面试套餐:Vue面试题总结+JavaScript前端经典面试题
宇小哥
博客等级 码龄5年 4粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值