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 Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

创建Java keystore文件的完整指南及详细步骤

《创建Javakeystore文件的完整指南及详细步骤》本文详解Java中keystore的创建与配置,涵盖私钥管理、自签名与CA证书生成、SSL/TLS应用,强调安全存储及验证机制,确保通信加密和... 目录1. 秘密键(私钥)的理解与管理私钥的定义与重要性私钥的管理策略私钥的生成与存储2. 证书的创建与

浅析Spring如何控制Bean的加载顺序

《浅析Spring如何控制Bean的加载顺序》在大多数情况下,我们不需要手动控制Bean的加载顺序,因为Spring的IoC容器足够智能,但在某些特殊场景下,这种隐式的依赖关系可能不存在,下面我们就来... 目录核心原则:依赖驱动加载手动控制 Bean 加载顺序的方法方法 1:使用@DependsOn(最直

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys