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

相关文章

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

SpringBoot 整合 Grizzly的过程

《SpringBoot整合Grizzly的过程》Grizzly是一个高性能的、异步的、非阻塞的HTTP服务器框架,它可以与SpringBoot一起提供比传统的Tomcat或Jet... 目录为什么选择 Grizzly?Spring Boot + Grizzly 整合的优势添加依赖自定义 Grizzly 作为

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB