标签题目
JavaScript相关面试题
new 关键字的运行流程?实现一个自己的 new
这题考察 new 的四步语义、原型链绑定、this 绑定和构造函数返回值规则,手写实现要覆盖返回对象的特殊分支。
说一下 JS 的继承机制
这道题考察 JS 继承背后的原型链查找、实例属性初始化、方法复用和 ES6 class 语义。高质量回答要把对象怎么找属性、子类实例怎么拿到父类初始化结果、不同继承写法各自的坑讲清楚。
了解 JS 的异步嘛?从单线程、事件循环、宏任务和微任务讲一下
这题考察的不是背宏任务、微任务名词,而是能否从调用栈、宿主异步、任务队列、微任务检查点和渲染机会推导代码执行顺序,并解释页面为什么会被长任务或微任务链卡住。
了解模块化么?说说 CommonJS 和 ESModule
这题不是只考 CommonJS 和 ESModule 的语法名称,而是看你能不能从加载流程解释绑定语义、循环依赖、Tree Shaking 和工程互操作。
为什么不用节流,说说防抖和节流的区别
这题考察防抖和节流的触发模型、场景选择和首尾触发配置,重点不是背定义,而是能解释为什么某个业务不用节流。
手写题:数组去重,用多种方式实现
这题考察数组去重的多种实现、相等判断和复杂度边界。高质量回答要覆盖基本类型、NaN、对象引用和对象数组按业务 key 去重。
事件循环和渲染的关系是怎么样的?
这题考察浏览器主线程调度:宏任务执行后清空微任务,随后浏览器在合适时机进行渲染;长任务和微任务堆积都会推迟渲染。
Promise.then 返回的是什么?
这题考察 Promise 链式调用的本质:then 总是返回新的 Promise,新 Promise 的状态由回调返回值、异常或 thenable 解析结果决定。
手撕发布订阅
这题考察发布订阅的核心数据结构和边界处理。高质量实现要包含 on、off、emit、once,并处理执行中增删监听器的问题。
手写:并发池
这题考察 Promise 调度能力。核心是限制同时运行的任务数,保持结果顺序,明确失败策略,并在任务完成后持续补位。
用过 TS 吗,跟 JS 有什么区别?
这题考察 TypeScript 的类型系统边界和工程价值。高质量回答要讲清它是编译期约束、最终运行仍是 JavaScript,并补充外部数据、any 和运行时校验的边界。
手撕:数组拉平(flatten)
这题考察递归遍历、depth 语义、顺序保持和边界处理。回答时要先约定函数契约,再写出不会丢类型的实现,并说明深层数组时的栈风险。
filter、map、reduce 的性能和区别是什么?
这题考察数组高阶函数的语义、返回值、遍历成本和可读性取舍。先讲用途差异,再谈性能,避免把所有问题都归结为 reduce 更强。
数组常用的 API,哪些能改变原数组?
这题考察数组 API 的可变性和返回值语义。回答时按会修改原数组、返回新数组、只读取查询三类整理,并强调 sort、reverse、splice 是高频坑。
闭包是什么,闭包会导致什么?
这题考察词法作用域、变量保留、封装能力和内存风险。回答要说明闭包不是天然泄漏,只有无必要长期持有引用才会形成问题。
同题还出现在 1 个公司岗位
this 绑定说说
这题考察 this 的调用点规则、绑定优先级和箭头函数词法 this。回答要强调看调用方式,不是看函数声明位置。
节流函数如何实现?
这道题考察的不是背出一个节流函数片段,而是能否清楚说明高频事件限流的边界语义:节流与防抖的区别、时间戳方案和定时器方案的触发时机差异、是否支持首次立即执行与最后一次补偿执行,以及如何正确保留 this、参数、取消能力和返回值限制。
箭头函数和普通函数有什么区别?
箭头函数是 ES6 引入的一种更简洁的函数写法,但它不只是语法糖。它最大的特点是没有自己的 this、arguments、super 和 new.target,其中 this 会按词法作用域从外层函数或模块环境中捕获,因此特别适合回调、数组方法和需要保留外层 this 的场景;但它不能作为构造函数,也没有 prototype,不适合对象方法、原型方法、构造器、事件处理器中依赖动态 this 的场景。
JavaScript 中 sleep 函数如何实现?
这道题考察的不是让 JavaScript 真正暂停线程,而是如何用异步机制表达“等待一段时间后继续执行”。高质量回答应说明 Promise 配合 setTimeout 的非阻塞实现、async/await 的调用方式、事件循环中宏任务与微任务的执行顺序,以及为什么忙等会卡死主线程。
vue2是怎么进行数组的方法重写的?
Vue2 对数组响应式的核心不是给每个下标都做 Object.defineProperty,而是创建一个继承自 Array.prototype 的 arrayMethods,重写 push、pop、shift、unshift、splice、sort、reverse 这 7 个会改变数组自身的方法。数组被 observe 时会挂上 __ob__,并把当前数组实例的原型指向 arrayMethods;调用被重写的方法后,Vue2 会先执行原生数组操作,再对新增元素 observeArray,最后通过 ob.dep.notify() 通知依赖更新。
说一下position的几个属性 css 有哪些单位?
这道题可以分成两部分回答:先讲 CSS 的 position 定位机制,包括 static、relative、absolute、fixed、sticky 的行为、参照物、是否脱离文档流以及对层叠关系的影响;再讲 CSS 单位体系,包括绝对单位、字体相关相对单位、视口单位、百分比以及时间、角度、分辨率等专用单位。核心不是背属性名,而是说明元素如何确定自己的位置、尺寸如何继承或换算,以及不同单位在响应式布局、可访问性和动画中的使用边界。
react18的事件系统相比于之前有什么变化?
React 18 的事件系统不是一次彻底重写,而是在 React 17 已经完成的 root 级事件委托基础上,进一步和自动批处理、事件优先级、并发渲染调度协同。回答时应先区分 17 和 18 的边界:委托位置从 document 迁移到 root 容器主要发生在 React 17,React 18 更重要的变化是让事件更新进入统一批处理模型,并根据事件优先级影响更新调度。
JavaScript 原型链的查找机制是什么?
JavaScript 原型链的查找机制,本质是对象属性访问时的一套逐级委托规则:先查对象自身属性,找不到再沿对象内部的 [[Prototype]] 指向继续查找,直到找到属性或到达 null 为止。面试中不仅要能说出查找顺序,还要区分 __proto__、构造函数的 prototype、实例对象之间的关系,并理解属性屏蔽、hasOwnProperty、in、class 语法糖这些高频追问点。
let、const 和 var 有什么区别?
这道题考察的不只是三种声明方式的表层语法,而是 JavaScript 变量绑定模型:作用域边界、提升行为、暂时性死区、重复声明、重新赋值、全局对象映射、循环闭包以及 const 对引用值的真实约束。面试中应从执行上下文和词法环境解释差异,再落到工程实践:默认使用 const,需要变更绑定时用 let,尽量避免 var。
React Hooks 的设计约束和原理是什么?
React Hooks 的核心不是给函数组件加几个 API,而是把组件的状态、副作用和复用逻辑从 class 实例模型迁移到 render 快照模型。它解决了 class 中状态逻辑难复用、生命周期拆散同一业务逻辑、this 绑定和高阶组件嵌套等问题,但也引入了稳定调用顺序、依赖数组和闭包快照等严格约束。
Virtual DOM 和真实 DOM 的区别是什么?
Virtual DOM 是用 JavaScript 对 UI 结构和状态结果做的一层描述;真实 DOM 是浏览器直接维护、参与样式计算、布局、绘制、事件和可访问性树等流程的节点对象。二者的关键区别在层级:Virtual DOM 让框架先在 JS 层计算 UI 变化、做 reconciliation 与调度,再把必要变更提交到真实 DOM。
Vue和React在创建组件的时候,说说最应该注意哪三点?
创建 Vue 和 React 组件时最应该注意三点:职责边界是否清晰、数据流与状态归属是否合理、副作用与性能边界是否可控。Vue 和 React 写法不同,但优秀组件都应该低耦合、可组合、可预测、易测试、易维护。
前端首屏性能优化有哪些关键手段?
首屏性能优化不是单点技巧,而是围绕关键渲染路径、资源下载、代码执行、数据返回和用户感知建立一套闭环。面试中要先讲清 FCP、LCP、TTI、INP 等指标口径,再分别说明构建产物、渲染模式、缓存 CDN、图片字体、接口与监控如何共同影响首屏体验。
Promise 的状态流转和 then 链式调用机制是什么?
Promise 的核心不是“异步容器”这么简单,而是一套状态机、回调注册机制、返回值吸收规则和微任务调度规则的组合。面试回答要把 pending 到 fulfilled 或 rejected 的单向迁移、then 返回新 Promise、回调异步执行、值穿透、异常传播、thenable 展开和微任务边界串成完整链路。
浏览器跨域问题如何解决?
跨域问题的本质不是浏览器完全禁止请求发出去,而是同源策略限制脚本读取不同源响应。标准解法优先是服务端正确配置 CORS;工程上还会结合同源反向代理、本地开发代理、JSONP、postMessage、WebSocket 等方案,但它们适用场景和安全边界不同。
JavaScript 数据类型有哪些?堆和栈在存储上有什么区别?
JavaScript 数据类型有哪些?堆和栈在存储上有什么区别?这道腾讯牛客题的关键是围绕“JavaScript 数据类型与堆栈存储”讲清概念、机制、取舍和边界。JavaScript 数据类型可以先分为原始类型和引用类型。原始类型包括 undefined、null、boolean、number、bigint、string、symbol;对象、数组、函数等属于引用类型。堆和栈的区别要从变量绑定和对象存储解释,而不是简单说某个类型绝对在栈上。