Javascript常见面试手写题

2024-09-01 17:12
文章标签 java 面试 常见 script 手写

本文主要是介绍Javascript常见面试手写题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Javascript常见面试手写题

欢迎Star ⭐️ github

通过自动化脚本,每次push会自动跑单测
100%单测通过,每一个方法都使用jest单元测试进行了验证

后续会持续更新

单测报告
每次push自动生成测试报告

  • 覆盖率
  • 单测概览
    请添加图片描述
    请添加图片描述

函数

题目描述
1.防抖
2.节流
5.深浅拷贝
6.发布订阅
7.函数柯里化
8.组合函数
9.before函数
10.偏函数

数组

题目描述
3.数组去重
4.数组扁平化

Javascript原理

题目描述
12.call
13.bind
14.apply
15.new
16.instanceof
17.模拟jsonp

未分类

题目描述
11.AJAX

1.防抖

// 1. 防抖
export function debounce(fn, delay, options) {let timer = null;let shouldInvoke = options.immediately // 是否立即执行return function(...args) {if (shouldInvoke) {fn.call(this, ...args)shouldInvoke = false}if (timer) {clearTimeout(timer)}timer = setTimeout(() => {fn.call(this, ...args)shouldInvoke = options.immediately}, delay)}
}

2.节流

// 节流函数
export function throttle(fn, delay) {let timer = nullreturn function (...args) {if (!timer) {fn.call(this, ...args)timer = setTimeout(() => {timer = null}, delay)} }
}

3.数组去重

export function uniqueArr(arr) {return [...new Set(arr)];
}export function uniqueArr2(arr) {return arr.filter((value, index) => arr.indexOf(value) === index);
}

4.数组扁平化

// 根据指定深度递归地将所有子数组元素拼接到新的数组中
// n默认1
export function flat(arr, n) {return arr.flat(n)
}// 全部扁平化
export function flat2(arr) {while(arr.some(item => Array.isArray(item))) {arr = [].concat(...arr);}return arr;
}// 递归法
export function flat3(arr, deep) {if (deep === 0) {return arr}let ret = []for (let i = 0 ; i < arr.length ; i ++){if (Array.isArray(arr[i])) {ret.push(...flat3(arr[i], deep - 1))} else {ret.push(arr[i])}}return ret
}

5.深浅拷贝

export function deepClone(obj) {if (obj === null || typeof obj!== 'object') {return obj;}if (Array.isArray(obj)) {return obj.map(item => deepClone(item));}const clonedObj = {};for (const key in obj) {if (obj.hasOwnProperty(key)) {clonedObj[key] = deepClone(obj[key]);}}return clonedObj;
}

6.发布订阅

export class EventEmitter {constructor() {this.events = {};}on(eventName, callback) {if (!this.events[eventName]) {this.events[eventName] = [];}this.events[eventName].push(callback);return this;}emit(eventName,...args) {if (this.events[eventName]) {this.events[eventName].forEach(callback => callback(...args));}return this;}off(eventName, callback) {if (this.events[eventName]) {this.events[eventName] = this.events[eventName].filter(cb => cb!== callback);}return this;}
}// const emitter = new EventEmitter();// const callback1 = (data) => {
//   console.log('Callback 1:', data);
// };// const callback2 = (data) => {
//   console.log('Callback 2:', data);
// };// emitter.on('event1', callback1);
// emitter.on('event1', callback2);// emitter.emit('event1', 'Hello from event emitter!');// emitter.off('event1', callback1);// emitter.emit('event1', 'Another emit after removing callback1.');

7.函数柯里化

export function curry(func) {return function curried(...args) {if (args.length >= func.length) {return func.apply(this, args);} else {return function (...nextArgs) {return curried.apply(this, [...args,...nextArgs]);};}};
}

8.组合函数

/*** 从右向左执行* https://juejin.cn/post/6844903910834962446*/
export function compose(...fns) {if(fns.length === 0) {return val => val}return function(val) {fns.reverse().forEach(fn => {val = fn(val)})return val}
}

9.before函数

/*** 指定函数调用次数*/
export function before (fn, times) {return (...args) => {if (times === 0) returnfn(...args)if (times > 0) {times-- }}
}

10.偏函数

export function partial(fn, ...arg) {return (...args) => {return fn(...arg, ...args)}
}

11.AJAX

// get
export function ajaxGet(url, callback) {const xhr = new XMLHttpRequest();xhr.open('GET', url, true);xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {callback(xhr.responseText);}};xhr.send();
}// post
export function ajaxPost(url, data, callback) {const xhr = new XMLHttpRequest();xhr.open('POST', url, true);xhr.setRequestHeader('Content-Type', 'application/json');xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200 || xhr.status === 201) {callback(xhr.responseText);} else {console.error('Error in POST request:', xhr.statusText);}}};xhr.send(JSON.stringify(data));
}

12.call

export function call(context, ...args) {if (context === null || context === undefined) {context = typeof window !== 'undefined' ? window : global} else {context = Object(context) // 原始值会被包装 如果是非原始值会直接返回}context.fn = this;let ret = context.fn(...args)delete context.fnreturn ret
}

13.bind

export function bind(context, ...args) {if (typeof this !== "function") {throw new TypeError("Error");}let self = thislet fBound = function (...args2) {return self.call(this instanceof self ? this : context, ...args, ...args2)}fBound.prototype = Object.create(self.prototype)return fBound
}

14.apply

export function apply (context, argsArray) {if (context === null || context === undefined) {context = typeof window !== 'undefined' ? window : global}context.fn = thislet ret = context.fn(...Array.from(argsArray))delete context.fnreturn ret
}

15.new

export function _new(constructor, ...args) {  // let obj = {}                            // 1. 创建一个空对象({})// obj.__proto__ = constructor.prototype          // 2. 链接该对象到另外一个对象let obj = Object.create(constructor.prototype)    // 替代1 2const ret = constructor.call(obj, ...args) // 3. 将创建的空对象作为this的上下文return typeof ret === 'object' ? ret : obj // 4. 如果该函数没有返回对象,则返回this
}

16.instanceof

export function _instanceof(V, F) {if (Object.prototype.toString.call(V) !== '[object Object]') {return false}let O = F.prototypeif (Object.prototype.toString.call(O) !== '[object Object]') {return false}while(true) {V = Object.getPrototypeOf(V)if (V === null) return falseif (V === O) return true}
}

17.模拟jsonp

export function jsonp(url) {return new Promise((resolve, reject) => {// 创建一个唯一的回调函数名const uniqueCallbackName = `jsonp_callback_${Date.now()}_${Math.random().toString(36).substring(2)}`;// 创建一个 script 标签const script = document.createElement('script');script.src = `${url}?callback=${uniqueCallbackName}`;// 定义全局回调函数window[uniqueCallbackName] = function(data) {resolve(data);// 清除全局回调函数和 script 标签delete window[uniqueCallbackName];document.body.removeChild(script);};// 处理错误情况script.onerror = function() {reject(new Error('JSONP request failed'));delete window[uniqueCallbackName];document.body.removeChild(script);};// 将 script 标签添加到文档中document.body.appendChild(script);});
}

这篇关于Javascript常见面试手写题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127556

相关文章

Spring WebClient从入门到精通

《SpringWebClient从入门到精通》本文详解SpringWebClient非阻塞响应式特性及优势,涵盖核心API、实战应用与性能优化,对比RestTemplate,为微服务通信提供高效解决... 目录一、WebClient 概述1.1 为什么选择 WebClient?1.2 WebClient 与

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

深入浅出SpringBoot WebSocket构建实时应用全面指南

《深入浅出SpringBootWebSocket构建实时应用全面指南》WebSocket是一种在单个TCP连接上进行全双工通信的协议,这篇文章主要为大家详细介绍了SpringBoot如何集成WebS... 目录前言为什么需要 WebSocketWebSocket 是什么Spring Boot 如何简化 We

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

SpringBoot监控API请求耗时的6中解决解决方案

《SpringBoot监控API请求耗时的6中解决解决方案》本文介绍SpringBoot中记录API请求耗时的6种方案,包括手动埋点、AOP切面、拦截器、Filter、事件监听、Micrometer+... 目录1. 简介2.实战案例2.1 手动记录2.2 自定义AOP记录2.3 拦截器技术2.4 使用Fi

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原