Web前端+Node.js面试题及详细答案(实战完整版)_第1页
Web前端+Node.js面试题及详细答案(实战完整版)_第2页
Web前端+Node.js面试题及详细答案(实战完整版)_第3页
Web前端+Node.js面试题及详细答案(实战完整版)_第4页
Web前端+Node.js面试题及详细答案(实战完整版)_第5页
已阅读5页,还剩7页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Web前端+Node.js面试题及详细答案(实战完整版)本套面试题适配初级、中级Web前端(含Node.js服务端开发)岗位,筛选企业高频面试考点,涵盖前端核心基础、异步编程、浏览器原理、Node.js基础、核心模块、异步模型、服务端开发、接口联调、性能优化及实战踩坑问题,答案贴合日常开发和面试场景,侧重实战落地,规避空洞理论。一、Web前端核心基础(10题)1.说一说JS的原型和原型链,日常开发中有什么实际作用?参考答案:每个JS对象都有一个隐式原型__proto__,指向它的构造函数的prototype显式原型;构造函数的prototype也有自己的原型,层层向上查找形成的链式结构,就是原型链。当访问一个对象的属性或方法时,会先在对象自身查找,找不到就沿着原型链向上查找,直到查到Ototype,最终找不到返回undefined。实际开发作用:一是实现属性和方法的复用,不用给每个实例单独挂载方法,节省内存;二是实现继承,日常封装组件、工具类、插件都会用到原型继承;三是可以给内置对象扩展方法,比如给Array、String封装自定义工具方法。2.谈谈this的指向问题,不同场景下this分别指向什么?参考答案:this的指向在函数调用时确定,和函数定义位置无关,不同场景规则很固定:1.普通函数直接调用:this指向window(浏览器)/global(Node);2.对象方法调用:this指向调用该方法的对象;3.构造函数调用:this指向new出来的实例对象;4.绑定事件函数:this指向绑定事件的DOM元素;5.箭头函数:没有独立this,继承外层作用域的this,且无法通过call、apply、bind修改;6.call、apply、bind:可以手动修改this指向,第一个参数即为新的this指向。3.call、apply、bind的区别和使用场景?参考答案:三者核心作用都是修改函数this指向,主要区别在传参和执行方式:1.call:立即执行函数,参数逐个传递,格式:函数.call(this指向,参数1,参数2);2.apply:立即执行函数,参数以数组形式传递,格式:函数.apply(this指向,[参数数组]);3.bind:不会立即执行,返回一个修改好this的新函数,需要手动调用,传参方式和call一致。常用场景:apply适合数组类操作,比如Math.max.apply(null,数组)求数组最大值;call适合对象借用方法;bind适合定时器、事件回调中固定this指向,避免this丢失。4.什么是闭包?闭包的优缺点及开发注意事项?参考答案:函数嵌套场景下,内层函数引用了外层函数的局部变量,外层函数执行完毕后,局部变量不会被销毁,这个现象就是闭包。简单说就是:内层函数留住了外层的变量。优点:可以创建私有变量,避免全局变量污染;延长变量生命周期;可以实现函数缓存、防抖节流、柯里化等功能。缺点:变量长期驻留内存,无法自动释放,容易造成内存堆积,频繁使用会导致页面卡顿。注意事项:开发中不要滥用闭包,使用完毕后及时手动置空变量,释放内存,避免内存泄漏。5.同步、异步的区别?JS为什么是单线程?参考答案:同步代码自上而下依次执行,上一段代码执行完毕,下一段才会执行,会阻塞后续代码;异步代码不会阻塞,耗时任务放入任务队列,主线程继续执行同步代码,等待同步代码执行完后,再执行异步回调。JS设计为单线程,核心原因是为了避免DOM操作冲突。如果是多线程,多个线程同时操作同一个DOM节点,会出现覆盖、错乱等问题,无法统一处理DOM渲染和交互。为了解决单线程阻塞问题,JS引入了事件循环机制,实现异步非阻塞执行,兼顾执行效率和DOM操作稳定性。6.宏任务和微任务的区别?事件循环执行顺序是什么?参考答案:宏任务是耗时较长的异步任务,执行优先级低,常见:setTimeout、setInterval、AJAX请求、文件读写、UI渲染。微任务是优先级更高的异步任务,耗时短,常见:Promise.then/catch/finally、async/await、queueMicrotask。事件循环完整执行顺序:1.先执行所有同步代码;2.清空所有微任务队列;3.执行一次宏任务队列中最先进入的任务;4.重复上述步骤,循环执行。核心口诀:同步优先,微任务先于宏任务,一轮一轮循环执行。7.Promise的三种状态及特点?如何解决回调地狱?参考答案:Promise有三种不可逆状态:pending(进行中)、fulfilled(成功)、rejected(失败)。状态一旦从pending变为成功或失败,就会永久固定,无法再次修改。回调地狱是多层异步回调嵌套,代码层级深、可读性差、难以维护。Promise通过链式调用解决回调地狱,将嵌套代码改为横向链式写法。配合async/await可以进一步简化异步代码,让异步代码写法接近同步代码,是目前项目中主流的异步处理方案。8.async/await的原理和使用注意事项?参考答案:async/await是Promise的语法糖,本质还是基于Promise实现。async修饰的函数默认返回Promise对象,await用于等待Promise执行完成,获取最终结果。注意事项:1.await只能在async函数内部使用,普通函数中无法使用;2.await默认等待成功状态,失败会抛出异常,需要通过try/catch捕获错误;3.多个无依赖的await串行执行会浪费时间,建议用Promise.all并行执行,提升效率。9.前端跨域的原因及常用解决方案?参考答案:跨域是浏览器同源策略的安全限制,当请求的协议、域名、端口三者任意一个和当前页面不一致,就会触发跨域拦截,目的是防止恶意网站窃取数据。常用解决方案:1.开发环境配置代理(Vue/React项目devServer代理),最常用,适合本地调试;2.服务端设置CORS跨域响应头,线上正式环境主流方案;3.Node中间件代理,通过本地Node服务转发请求,规避跨域;4.JSONP,仅支持GET请求,兼容性好,现在使用较少。10.前端防抖和节流的区别及实战场景?参考答案:防抖:频繁触发事件时,只在最后一次触发后延迟执行一次,中途触发会重置计时,核心是“停止触发后再执行”。适用场景:搜索框输入联想、表单实时校验、窗口缩放、输入框失前验证。节流:固定时间内无论触发多少次,只执行一次,核心是“固定频率执行”。适用场景:页面滚动加载、鼠标移动监听、按钮频繁点击、轮播切换、拖拽事件。两者核心作用都是减少无效请求和DOM操作,降低浏览器和服务器压力,提升页面流畅度。二、Node.js基础核心(8题)1.简单说说Node.js是什么?和浏览器端JS有什么区别?参考答案:Node.js是基于V8引擎的服务端JavaScript运行环境,让JS可以脱离浏览器,在服务器、本地终端运行,实现前端语言开发服务端程序。和浏览器JS的核心区别:1.运行环境不同:浏览器端依赖浏览器内核,Node端独立运行在服务器/本地;2.内置API不同:浏览器有DOM、BOM操作API;Node没有DOM/BOM,内置文件读写、网络请求、进程操作、路径处理等服务端API;3.全局对象不同:浏览器全局是window,Node全局是global;4.模块系统不同:Node支持CommonJS模块规范,浏览器主流是ES6Module;5.用途不同:浏览器端负责页面交互、DOM渲染;Node端负责接口开发、文件处理、脚手架、爬虫、中间层服务。2.Node.js的模块系统是什么?CommonJS和ESModule的区别?参考答案:Node.js默认采用CommonJS模块规范,所有文件都是独立模块,拥有独立作用域,避免变量全局污染。通过require引入模块,module.exports/exports导出模块。CommonJS和ESModule核心区别:1.规范归属:CommonJS是Node默认规范,ESModule是浏览器和Node通用的官方标准;2.加载方式:CommonJS运行时同步加载,适合服务端;ESModule编译时静态加载,支持Tree-Shaking;3.语法不同:CommonJS用require、module.exports;ESModule用import、export;4.缓存机制:两者都有模块缓存,加载过的模块会缓存,重复引入不会重复执行;5.导出特性:CommonJS导出的是值的拷贝,原模块修改不会影响引入值;ESModule导出的是值的引用,原模块更新后引入值同步更新。3.Node.js常用核心模块有哪些?分别有什么作用?参考答案:日常开发高频核心模块无需安装,Node自带,重点常用:1.fs:文件操作系统模块,实现文件读取、写入、删除、重命名、文件夹创建等操作,是Node最核心模块之一;2.path:路径处理模块,统一处理不同系统的文件路径,解决Windows和Linux路径分隔符差异,常用拼接、解析绝对/相对路径;3.http/https:网络服务模块,用于搭建本地Web服务、开发后端接口、发起网络请求;4.url:URL地址解析模块,用于解析请求地址、获取参数、格式化URL;5.querystring:参数序列化模块,处理URL参数、表单参数的解析和拼接;6.stream:流操作模块,处理大文件读写、流式传输,避免一次性加载大文件导致内存溢出。4.Node.js中同步和异步文件操作的区别,开发如何选择?参考答案:fs模块分为同步方法(fs.readFileSync)和异步方法(fs.readFile、mises.readFile)。同步文件操作:会阻塞主线程,代码执行完毕后才会继续往下走,写法简单,无需回调;异步文件操作:非阻塞主线程,文件读写在后台执行,不影响主程序运行,通过回调或Promise返回结果。开发选择规范:1.脚手架、初始化配置、一次性读取配置文件等启动阶段操作,可用同步方法;2.接口服务、持续运行的项目中,一律使用异步方法,避免阻塞服务运行,保证服务并发能力。5.什么是Node事件循环?和浏览器事件循环有什么差异?参考答案:Node事件循环是Node实现异步非阻塞的核心机制,负责调度异步任务的执行顺序,解决单线程阻塞问题。和浏览器事件循环最大区别:1.执行阶段不同:浏览器只有微任务、宏任务两个层级;Node分为6个阶段(timers、pending、idle、poll、check、close),阶段有序执行;2.微任务执行时机不同:浏览器是每执行一个宏任务,就清空一次微任务;Node是执行完一个完整阶段的所有宏任务,再统一清空所有微任务;3.优先级差异:Node中process.nextTick优先级高于普通微任务,浏览器无此API。6.Node中buffer和stream的区别?适用场景?参考答案:buffer是内存中的二进制缓冲区,用于存储临时二进制数据,所有文件、网络数据传输都会转为buffer,适合处理小文件、短数据。stream是流式数据处理方案,将大文件、大数据拆分为小块数据逐块读取、处理、写入,无需一次性加载全部数据到内存。适用场景:小文件读写、简单数据转换用buffer;大文件上传下载、视频流传输、日志批量处理必须用stream,有效防止内存溢出,提升程序稳定性。7.Node.js如何处理异常?常见错误类型有哪些?参考答案:日常开发常用异常处理方式:同步代码用try/catch捕获;异步回调通过回调第一个参数接收错误;Promise用catch捕获;async/await用try/catch捕获。全局未捕获异常可以通过process.on('uncaughtException')监听,防止程序直接崩溃。常见错误类型:文件不存在错误、权限不足错误、网络请求超时错误、参数格式错误、内存溢出错误、端口占用错误。8.package.json和package-lock.json的作用和区别?参考答案:package.json是项目配置文件,记录项目名称、版本、依赖、脚本命令、项目描述等基础信息,声明项目需要的依赖包及版本范围。package-lock.json是自动生成的锁定文件,精准记录所有依赖包的具体版本、下载地址、依赖层级,保证不同设备、不同环境安装的依赖版本完全一致,避免版本差异导致的项目报错。开发规范:团队协作项目必须提交lock文件,保证项目环境统一。三、Node服务端开发实战(7题)1.如何用Node搭建一个基础Web服务?核心流程是什么?参考答案:核心流程分为三步:引入http模块、创建服务、监听端口。1.引入Node内置http核心模块;2.通过http.createServer创建服务,监听客户端请求,获取请求方式、请求地址、请求参数;3.设置响应头、响应状态码,返回对应数据给客户端;4.调用listen方法监听指定端口和IP,启动服务。基础原生服务可以实现简单接口开发,实际项目中会基于Express、Koa框架开发,简化原生繁琐配置。2.Express和Koa框架的区别?项目中如何选择?参考答案:两者都是Node主流Web框架,核心区别:1.设计理念:Express传统经典框架,中间件基于回调函数,成熟稳定、生态完善;Koa是新一代框架,基于async/await实现中间件,摒弃回调,代码更简洁优雅;2.中间件机制:Express是顺序执行,执行完不会回溯;Koa中间件支持洋葱模型,先进后出,可在请求前后做统一处理;3.内置功能:Express内置路由、静态资源托管等基础功能;Koa极简,几乎无内置功能,需要手动引入中间件,灵活性更高。选择原则:快速开发、传统项目、依赖成熟插件选Express;新项目、追求代码整洁、轻量化架构选Koa。3.什么是中间件?Express/Koa中间件的作用和执行流程?参考答案:中间件是介于客户端请求和接口业务逻辑之间的函数,可以接收请求、处理数据、拦截请求、响应结果,是Node框架的核心机制。常用中间件功能:跨域处理、参数解析、日志打印、权限校验、路由拦截、静态资源托管、错误统一处理。执行流程:客户端发起请求后,会依次经过注册的全局中间件、路由中间件,执行next()进入下一个中间件或业务逻辑,所有逻辑执行完毕后,逐层返回响应给客户端。4.Node接口开发中,GET和POST参数如何获取?参考答案:原生Node:GET参数通过url模块解析地址获取;POST参数需要通过监听req的data事件拼接数据流,再解析参数。Express/Koa框架:1.GET参数:直接通过req.query获取,框架自动解析URL拼接参数;2.POST参数:需要配置body解析中间件(express.json、koa-body),通过req.body获取表单、JSON参数;优势是框架封装了底层复杂的数据流拼接逻辑,开发更高效。5.Node项目如何处理跨域问题?实战常用方案?参考答案:Node服务端解决跨域最常用两种方案:1.CORS跨域配置:手动设置响应头Access-Control-Allow-Origin、Access-Control-Allow-Methods等,允许前端域名跨域请求,适合简单项目;2.跨域中间件:使用cors中间件,一行代码全局开启跨域,支持配置指定域名、请求方式、请求头,是企业项目主流方案,稳定且易于维护。开发环境也可通过前端代理解决,线上必须服务端配置跨域。6.Node如何实现文件上传功能?核心流程是什么?参考答案:实际项目借助multer(Express)、koa-body(Koa)中间件实现文件上传,核心流程:1.前端通过form-data格式提交文件数据;2.后端中间件拦截文件请求,解析文件名称、格式、大小、二进制数据;3.校验文件格式、大小,过滤非法文件;4.生成唯一文件名,防止重名覆盖;5.通过fs模块将文件写入服务器指定目录;6.返回文件访问路径给前端,完成上传。7.Node服务如何统一处理全局错误,防止服务崩溃?参考答案:Node默认一旦出现未捕获异常,整个服务会直接退出,所以必须做全局错误处理:1.框架层统一错误中间件:捕获所有路由、中间件的异常,统一返回错误格式,不直接抛出崩溃;2.监听全局未捕获异常:通过process.on('uncaughtException')捕获同步异常,process.on('unhandledRejection')捕获Promise异步异常;3.开发规范:所有异步逻辑必须捕获错误,禁止裸写Promise、async函数;4.线上配合进程守护工具pm2,服务异常自动重启,保证服务稳定运行。四、工程化与性能优化(5题)1.npm、yarn、pnpm的区别?为什么现在主流用pnpm?参考答案:npm是官方默认包管理工具,生态最全,但安装速度慢、磁盘占用大、依赖冗余多;yarn解决了npm早期版本依赖不稳定、速度慢的问题,稳定性更好,但依然存在磁盘冗余问题;pnpm是新一代包管理工具,核心优势:1.采用硬链接+软链接机制,全局复用依赖文件,极大节省磁盘空间;2.安装、更新、卸载速度远超npm和yarn;3.严格的依赖校验,杜绝幽灵依赖,项目稳定性更高;目前主流新项目、大厂项目均优先使用pnpm。2.什么是幽灵依赖?pnpm如何解决该问题?参考答案:幽灵依赖是项目中没有在package.json声明,但可以直接引用的依赖,是npm、yarn的常见问题。依赖层级混乱,升级、迁移项目时容易出现依赖丢失报错,隐患极大。pnpm通过严格的依赖目录结构,只允许引用项目显式声明的依赖,未声明的依赖无法直接导入,从根源杜绝幽灵依赖,保证项目依赖清晰、可维护。3.Node项目性能优化有哪些常用手段?参考答案:1.异步优化:全程使用异步API,杜绝同步阻塞,保证服务并发能力;2.资源优化:大文件操作使用stream流式处理,避免内存溢出;3.缓存优化:接口数据、静态资源添加缓存,减少重复计算和数据库请求;4.依赖优化:精简无用依赖,合理拆分路由和中间件,减少无效执行;5.进程优化:多核心服务器开启多进程运行,充分利用服务器资源;6.日志优化:分级打印日志,生产环境关闭冗余日志,减少IO消耗。4.如何解决Node内存泄漏问题?常见排查方式?参考答案:常见内存泄漏场景:全局变量滥用、闭包常驻内存、定时器/事件监听未销毁、缓存无限累加、数据流未关闭。排查方式:通过process.memoryUsage查看内存占用;使用Chrome开发者工具抓取内存快照,对比内存增长趋势,定位未释放的对象和资源;线上通过日志监控内存波动,及时发现异常。解决核心:及时销毁无效定时器、事件监听,清空冗余缓存,避免全局常驻变量,合理释放闭包内存。5.pm2的作用是什么?线上Node项目为什么必须用pm2?参考答案:pm2是Node企业级进程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论