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实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

SpringBoot简单整合ElasticSearch实践

《SpringBoot简单整合ElasticSearch实践》Elasticsearch支持结构化和非结构化数据检索,通过索引创建和倒排索引文档,提高搜索效率,它基于Lucene封装,分为索引库、类型... 目录一:ElasticSearch支持对结构化和非结构化的数据进行检索二:ES的核心概念Index:

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加