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将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

Java 中的 @SneakyThrows 注解使用方法(简化异常处理的利与弊)

《Java中的@SneakyThrows注解使用方法(简化异常处理的利与弊)》为了简化异常处理,Lombok提供了一个强大的注解@SneakyThrows,本文将详细介绍@SneakyThro... 目录1. @SneakyThrows 简介 1.1 什么是 Lombok?2. @SneakyThrows

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java中的工具类命名方法

《Java中的工具类命名方法》:本文主要介绍Java中的工具类究竟如何命名,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java中的工具类究竟如何命名?先来几个例子几种命名方式的比较到底如何命名 ?总结Java中的工具类究竟如何命名?先来几个例子JD

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依