【面试题】 面试手写JS 十六题(必看)
admin
2024-04-02 21:00:47
0

  给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

 

1、手写实现防抖和节流

1.1 实现防抖函数

防抖函数原理:把触发非常频繁的事件合并成一次去执行 在指定时间内只执行一次回调函数,如果在指定的时间内又触发了该事件,则回调函数的执行时间会基于此刻重新开始计算

// func是用户传入需要防抖的函数
// time是等待时间
const debounce = (callback, time = 50) => {let timer = 0return function(...args) {if (timer) clearTimeout(timer)timer = setTimeout(() => {callback.apply(this, args)}, time)}
}
复制代码

1.2 实现节流函数

节流函数原理: 指频繁触发事件时,只会在指定的时间段内执行事件回调,即触发事件间隔大于等于指定的时间才会执行回调函数。

// func是用户传入需要防抖的函数
// wait是等待时间
const throttle = (func, wait = 50) => {let lastTime = 0return function(...args) {let now = +new Date()if (now - lastTime > wait) {lastTime = nowfunc.apply(this, args)}}
}
复制代码

2、手写深拷贝

调用深拷贝方法,若属性为值类型,则直接返回;若属性为引用类型,则递归遍历。这就是我们在解这一类题时的核心的方法。

function deepClone(obj) {if(typeof obj !== 'object' || obj === null) {return obj}let copy = {}if(obj.constructor === Array) {copy = []}for(let key in obj) {if(obj.hasOwnProperty(key)) {copy[key] = deepClone(obj[key])}}return copy
} 
复制代码

3、手写实现call方法

call做了什么

  1. 将函数设为对象的属性
  2. 执行和删除这个函数
  3. 指定this到函数并传入给定参数执行函数
  4. 如果不传入参数,默认指向为 window
Function.prototype.myCall = function(context = window, ...args) {if (typeof this !== "function") {throw new Error('type error')}let key = Symbol('key')context[key] = this;let result = context[key](...args);delete context[key];return result;
};
复制代码

4 手写apply方法

Function.prototype.myApply = function(context = window, args) {let key = Symbol('key')context[key] = this;// let args = [...arguments].slice(1)let result = context[key](...args);delete context[key]; return result;
}
复制代码

5、手写forEach方法

Array.prototype.myForEach = function(callback, context=window) {let self = this,  i = 0,len = self.length;for(;i

6、手写filter方法

Array.prototype.myFilter=function(callback, context=window){let len = this.lengthnewArr = [],i=0for(; i < len; i++){if(callback.apply(context, [this[i], i , this])){newArr.push(this[i]);}}return newArr;
}
复制代码

7、手写reduce方法

Array.prototype.myReduce = function(fn, initialValue) {var arr = Array.prototype.slice.call(this);var res, startIndex;res = initialValue ? initialValue : arr[0];startIndex = initialValue ? 0 : 1;for(var i = startIndex; i < arr.length; i++) {res = fn.call(null, res, arr[i], i, this); }return res;
}
复制代码

8 查找字符串中出现最多的字符和个数

字符最多的是char,出现了num次

function myString(str){let num = 0;let char = '';let re = /(\w)\1+/g;str.replace(re,($0,$1) => {if(num < $0.length){num = $0.length;char = $1;        }});return {num, char}
}复制代码

9 冒泡排序

冒泡排序的原理如下,从第一个元素开始,把当前元素和下一个索引元素进行比较。如果当前元素大,那么就交换位置,重复操作直到比较到最后一个元素,那么此时最后一个元素就是该数组中最大的数。下一轮重复以上操作,但是此时最后一个元素已经是最大数了,所以不需要再比较最后一个元素,只需要比较到 length - 1 的位置

function bubbleSort(list) {var n = list.length;if (!n) return [];for (var i = 0; i < n; i++) {// 注意这里需要 n - i - 1for (var j = 0; j < n - i - 1; j++) {if (list[j] > list[j + 1]) {var temp = list[j + 1];list[j + 1] = list[j];list[j] = temp;}}}return list;
}
复制代码

10 快速排序

快排的原理如下。随机选取一个数组中的值作为基准值,从左至右取值与基准值对比大小。比基准值小的放数组左边,大的放右边,对比完成后将基准值和第一个比基准值大的值交换位置。然后将数组以基准值的位置分为两部分,继续递归以上操作

function quickSort(arr) {if (arr.length<=1){return arr;}var baseIndex = Math.floor(arr.length/2);var base = arr.splice(baseIndex,1)[0];var left=[];var right=[];for (var i = 0; i

11 插入排序

function insertSort(arr) {for (let i = 1; i < arr.length; i++) {let j = i;let target = arr[j];while (j > 0 && arr[j - 1] > target) {arr[j] = arr[j - 1];j--;}arr[j] = target;}return arr;
}
复制代码

12 对象扁平化

function objectFlat(obj = {}) {const res = {}function flat(item, preKey = '') {Object.entries(item).forEach(([key, val]) => {const newKey = preKey ? `${preKey}.${key}` : keyif (val && typeof val === 'object') {flat(val, newKey)} else {res[newKey] = val}})}flat(obj)return res
}
复制代码

13、手写发布订阅模式

  • 创建一个对象
  • on方法用来把回调函数fn都加到缓存列表中
  • emit 根据key值去执行对应缓存列表中的函数
  • off方法可以根据key值取消订阅
class EventEmiter {constructor() {this._events = {}}on(eventName,callback) {if(!this._events) {this._events = {}}this._events[eventName] = [...(this._events[eventName] || []),callback]}emit(eventName, ...args) {if(!this._events[eventName]) {return}this._events[eventName].forEach(fn=>fn(...args))}off(eventName,cb) {if(!this._events[eventName]) {return}this._events[eventName] = this._events[eventName].filter(fn=>fn != cb && fn.l != cb)}once(eventName,callback) {const one = (...args)=>{callback(args)this.off(eventName,one)}one.l = callbackthis.on(eventName,one)}
}
复制代码

14、手写Ajax

  • 创建 XMLHttpRequest 实例
  • 发出 HTTP 请求
  • 服务器返回 XML 格式的字符串
  • JS 解析 XML,并更新局部页面
  • 不过随着历史进程的推进,XML 已经被淘汰,取而代之的是 JSON。
function ajax(url) {return new Promise((resolve, reject) => {let xhr = new XMLHttpRequest()xhr.open('get', url)xhr.onreadystatechange = () => {if (xhr.readyState == 4) {if (xhr.status >= 200 && xhr.status <= 300) {resolve(JSON.parse(xhr.responseText))} else {reject('请求出错')}}}xhr.send()})
}
复制代码

15、数组去重

function uniqueArr(arr) { return [...new Set(arr)]; }
复制代码

16、实现new的过程

new操作符做了这些事:

  • 创建一个全新的对象
  • 这个对象的__proto__要指向构造函数的原型prototype
  • 执行构造函数,使用 call/apply 改变 this 的指向
  • 返回值为object类型则作为new方法的返回值返回,否则返回上述全新对象
function myNew(fn, ...args) {let newObj = Object.create(fn.prototype);let res = fn.apply(newObj, args);return typeof res === 'object' ? res: newObj;
}

 

  给大家推荐一个实用面试题库

1、前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

相关内容

热门资讯

原创 今... 今日为5月23日,国际现货黄金价格在4500美元/盎司整数关口附近徘徊不前,日内最低触及4480美元...
三连亏后变为“无主”状态,农尚... 从吴亮手中接盘农尚环境(300536)不足三年后,林峰如今让出了公司控制权,上市公司进入“无主”状态...
55岁湖南女首富出手!豪掷13... 快科技5月24日消息,与马斯克、库克并肩而坐,刚参加完国宴的湖南女首富周群飞就买了家上市企业。 近日...
外资加仓A股,岂是跟风这么简单... 熬过忙碌的交易日,在周末安静时段,理清接下来布局方向。本篇为大家准备了5条要闻,涵盖市场动态、行业变...
原创 俄... 在全球能源的残酷牌桌上,手里攥着石油,腰杆子才能硬气。长期以来,中东的沙漠、俄罗斯的冰原、美国的页岩...
喜力啤酒有产品将涨价,华润啤酒... 来源:红星新闻 红星资本局5月22日消息,今日,红星资本局从雪花啤酒(厦门)有限公司、华润啤酒方面获...
原创 金... 心理预期调整刻不容缓,五月二十二日,黄金价格或将重现十五年前的历史性低迷。 近期若您密切关注着黄金市...
原创 马... 埃隆·马斯克如果能让SpaceX实现“科幻小说”级别的目标,他可能获得1万亿美元的收入。 埃隆·马斯...
涨涨涨!放开限制、可加杠杆!这... 韩国股市站在风口上! 据最新消息,为吸引更多海外资金进入股市,韩国政府计划放开限制,允许境外投资者直...
下周9家上会丨科创板首单IPO... IPO及再融资上会预告 据交易所官网审核动态信息,下周(5.25-5.29)IPO上会审核6家企业,...
富途、老虎市值蒸发1/4!或被... 来源:金融时报 5月22日,中国证监会宣布依法对Tiger Brokers (NZ) Limited...
马爸爸的好兄弟钱多多搞了杀猪盘... *此图由AI生成 作者| 史大郎&猫哥 来源| 是史大郎&大猫财经Pro 上周四,港股经纬天地大崩盘...
原创 壳... 编辑:XL 国际能源圈最近炸开了锅,壳牌这家百年石油巨头在2026年3月与委内瑞拉政府正式签署多项油...
存储热潮愈演愈烈!奖金拿到手软... 财联社5月24日讯(编辑 卞纯)在席卷全球的存储芯片热潮中,韩国“存储芯片双雄”SK海力士和三星无疑...
揽牌、合作、生态,跨境支付头部... 近日,国内头部跨境支付机构密集落地海外重要布局,一方面,连连数字、PingPong两家公司相继在中东...
原创 帮... 老铁们,周末好!我是帮主郑重。刚扫了一眼下周的财经日历,好家伙,事件一个接一个,堪称“消息面轰炸周”...
海南省住建厅与中国石化海南石油... 5月22日,中国石化海南石油分公司代表、党委书记李新强、总经理蔡文东一行赴海南省住建厅拜访交流。省住...
原创 金... 2026年5月22日,国际黄金价格报4536.7美元/盎司,较前期高点5597美元回落约1100美元...
“双标”换卡背后,银行还需多些... 新华社记者 颜之宏、杨深深 持到期银行卡和身份证去银行网点换新卡,却被要求“必须交回旧卡才能取新卡”...
“离境退税2.0”带动“中国购... 【环球时报综合报道】编者的话:5月18日,商务部等6部门联合发布《关于加力优化离境退税措施扩大入境消...