2026年JavaScript高频面试题及详细答案(实战版)_第1页
2026年JavaScript高频面试题及详细答案(实战版)_第2页
2026年JavaScript高频面试题及详细答案(实战版)_第3页
2026年JavaScript高频面试题及详细答案(实战版)_第4页
2026年JavaScript高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

2026年JavaScript高频面试题及详细答案(实战版)说明:本套题目精选2025-2026大厂前端面试高频考点,覆盖基础核心、ES6+、作用域与闭包、原型与继承、异步编程、DOM与性能、手写源码、实战踩坑,答案贴合真实面试口述逻辑,简洁不冗余,无模板化话术。一、JS基础核心(高频必问)1、说说==和===的区别,开发中怎么选择使用?答案:==是宽松相等,会先进行隐式类型转换,再比较值;===是严格相等,不做任何类型转换,必须类型和值完全一致才返回true。常见转换规则:数字和字符串比较,字符串转数字;null和undefined相等,且不等于其他任何值;布尔值和其他类型比较,布尔转数字。开发规范:日常业务统一使用===,避免隐式转换带来的诡异bug;仅在判断null/undefined时可以用obj==null(等价于obj===null||obj===undefined)。示例:javascript

console.log('5'==5)//true

console.log('5'===5)//false

console.log(null==undefined)//true

console.log(null===undefined)//false2、JS的数据类型有哪些?typeof判断的坑是什么?答案:一共8种数据类型:7种基本类型(String、Number、Boolean、Null、Undefined、Symbol、BigInt)+1种引用类型(Object,包含对象、数组、函数、正则等)。typeof常见坑点:1、typeofnull输出'object',属于JS最初的底层bug,无法修复;2、数组、普通对象、正则都会被判定为'object',无法区分;3、typeof函数会返回'function',是特殊情况。精准判断类型推荐用Ototype.toString.call()。3、undefined和null的区别?实际开发中场景?答案:undefined代表未定义:变量声明未赋值、对象不存在的属性、函数无返回值、形参未传参,都会出现undefined。null代表空对象:主动赋值的空值,用来手动清空对象、初始化空引用。开发场景:后端返回空数据、清空页面实例、重置引用类型数据用null;代码主动赋值不会手动写undefined,undefined大多是程序自动产生的。4、JS隐式类型转换规则,举例常见坑答案:隐式转换主要出现在加减乘除、==、if判断等场景,核心规则:1、加法运算:只要有字符串,全部转为字符串拼接;2、减乘除运算:全部转为数字计算;3、布尔转换:0、''、null、undefined、NaN、false为假,其余为真。常见坑:javascript

console.log(1+'2')//'12'拼接

console.log('10'-2)//8数值计算

console.log([]==0)//true

console.log([]=='')//true二、作用域、变量提升、闭包(核心难点)5、var/let/const的区别?2026开发规范答案:1、变量提升:var存在变量提升,声明提前,初始值undefined;let/const无提升,存在暂时性死区,声明前访问会报错;2、作用域:var只有函数作用域、全局作用域;let/const支持块级作用域(if/for/{});3、重复声明:var允许重复声明;let/const禁止重复声明;4、赋值:let可修改;const声明后不能改栈地址,引用类型可修改内部属性。2026开发规范:彻底弃用var,基础变量用let,常量/固定引用用const。6、什么是暂时性死区?答案:在代码块中,使用let/const声明的变量,从代码块开始到变量声明语句之间的区域,叫做暂时性死区。这个区域内无法访问该变量,访问直接报错Cannotaccess'xxx'beforeinitialization,目的是杜绝变量提升带来的混乱问题。7、讲讲闭包,优缺点及开发场景答案:闭包:内层函数访问外层函数的变量,且内层函数被外部引用,导致外层函数作用域无法销毁,形成闭包。核心作用:保留私有变量、延长作用域链、隔离作用域。开发场景:防抖节流、模块化封装、定时器保存变量、私有方法、柯里化。缺点:常驻内存,容易造成内存泄漏,滥用会导致页面卡顿;解决方案:使用完毕手动置空变量。8、循环定时器经典闭包坑及解决方案答案:经典问题:var循环+定时器,所有定时器最终都取到最后一个i值。原因是var无块级作用域,所有定时器共享同一个变量。解决方案:1、将var改为let,let自带块级作用域,每次循环生成独立变量;2、利用立即执行函数创建独立作用域。三、this指向、箭头函数(高频坑题)9、JS中this的指向规则?答案:this指向调用时的执行上下文,和定义位置无关,优先级从高到低:1、new绑定:指向实例对象;2、call/apply/bind绑定:指向绑定的对象;3、对象方法调用:指向调用的对象;4、普通函数调用:非严格模式指向window,严格模式指向undefined;5、箭头函数:无自身this,继承外层作用域的this,且无法修改。10、箭头函数和普通函数的区别?能否用作构造函数?答案:1、this指向:箭头函数无this,继承外层;普通函数this由调用方式决定;2、arguments:箭头函数无arguments,只能用剩余参数;普通函数有arguments;3、原型:箭头函数无prototype原型属性;4、构造函数:箭头函数不能new,没有this、无法生成实例、无原型;5、generator:箭头函数不能作为生成器函数,不能用yield。11、分析下面代码输出结果(this经典考题)javascript

constshape={

radius:10,

diameter(){

returnthis.radius*2;

},

perimeter:()=>2*Math.PI*this.radius

};

console.log(shape.diameter());

console.log(shape.perimeter());答案:20、NaN解析:diameter是普通对象方法,this指向shape实例,能取到radius;perimeter是箭头函数,继承外层全局this,全局无radius属性,值为undefined,计算后为NaN。四、原型、原型链、继承(进阶核心)12、说说原型和原型链的理解答案:每个函数都有prototype(显式原型),每个实例对象都有__proto__(隐式原型),实例的__proto__指向构造函数的prototype。原型链:对象查找属性/方法时,先在自身查找,找不到就顺着__proto__往上找,直到Ototype,最终指向null,这条链式结构就是原型链。核心作用:实现属性和方法的复用,节省内存,是JS实现继承的底层原理。13、JS常见的继承方式,优缺点对比答案:1、原型链继承:简单,但是所有实例共享引用属性,容易互相污染;2、构造函数继承:解决属性共享问题,无法继承原型方法;3、组合继承:结合两者,存在父构造函数执行两次的冗余问题;4、寄生组合继承:最优传统继承方式,无冗余、无属性污染;5、ES6class继承:语法糖,底层基于寄生组合继承,写法简洁,支持静态属性、super调用,日常开发首选。14、手写ES6class继承答案:javascript

classParent{

constructor(name){

=name;

}

sayName(){

console.log();

}

}

classChildextendsParent{

constructor(name,age){

//必须先调用super,继承父类属性

super(name);

this.age=age;

}

sayAge(){

console.log(this.age);

}

}五、ES6+高频考点(2026必考)15、Promise是什么?三种状态及特点答案:Promise是异步编程的解决方案,用来解决回调地狱问题,让异步代码扁平化、可维护。三种状态:pending(进行中)、fulfilled(成功)、rejected(失败)。核心特点:状态一旦改变不可逆,只能从pending转为成功或失败;状态改变后无法再次修改。16、Promise.all/race/allSettled区别及使用场景答案:1、Promise.all:全部成功才返回结果数组,任意一个失败立即reject,适合多个异步强依赖场景;2、Promise.race:谁先完成就返回谁的结果(成功/失败),适合超时拦截、请求竞速;3、Promise.allSettled:等待所有请求结束,不管成功失败,返回每个任务的状态和结果,适合批量请求、无需中断任务场景(2026项目高频使用)。17、可选链?.和空值合并??的用法和区别答案:可选链?.:用于安全读取深层对象属性,属性不存在时返回undefined,不报错,避免层层判断。空值合并??:只有值为null/undefined时才返回默认值,0、''、false等假值不会触发默认值。区别:||会被0、空字符串等假值拦截,??只拦截空值,业务配置默认值优先用??。javascript

constcity=user?.profile?.address?.city;

constnum=0??10;//0,不触发默认值

constnum2=0||10;//1018、Proxy能否监听深层对象?怎么处理?答案:Proxy默认只能监听首层属性,深层嵌套对象不会主动劫持,因为深层对象是新的引用地址。解决方案:递归代理,在get捕获器中,判断当前取值的类型是对象且未被代理,就递归创建Proxy实例,实现深层监听。Vue3响应式原理核心就是递归Proxy。六、异步与EventLoop(面试重灾区)19、讲讲JS事件循环机制(浏览器端)答案:JS是单线程语言,通过事件循环实现异步,核心流程:1、先执行同步代码,执行完毕清空调用栈;2、执行微任务队列所有任务(Promise.then、queueMicrotask、await后续代码);3、执行宏任务队列一个任务(setTimeout、setInterval、DOM事件、AJAX);4、重复以上步骤,循环执行。优先级:同步代码>微任务>宏任务。20、async/await原理?和Promise的关系答案:async/await是Promise的语法糖,本质还是Promise,目的是让异步代码像同步代码一样直观。async修饰的函数,返回值一定会包装成Promise;await会阻塞后续代码,等待Promise状态变更。执行顺序:await后面的代码会推入微任务队列,等待同步代码执行完毕后执行。异常处理:await报错需要用try/catch捕获,避免程序崩溃。七、手写源码(2026必刷实操题)21、手写简易Promise.all答案:javascript

functionpromiseAll(promises){

returnnewPromise((resolve,reject)=>{

//兼容空数组

if(!Array.isArray(promises))returnreject(newError('参数必须是数组'))

constres=[]

letcount=0

constlen=promises.length

if(len===0)returnresolve([])

promises.forEach((item,index)=>{

//统一转为Promise执行

Promise.resolve(item).then(val=>{

res[index]=val

count++

if(count===len)resolve(res)

}).catch(err=>reject(err))

})

})

}22、手写防抖、节流答案:防抖:频繁触发,只在停止触发后延迟执行一次(搜索框输入、窗口resize);javascript

functiondebounce(fn,delay=300){

lettimer=null

returnfunction(...args){

clearTimeout(timer)

timer=setTimeout(()=>fn.apply(this,args),delay)

}

}节流:频繁触发,固定时间只执行一次(滚动监听、按钮频繁点击);javascript

functionthrottle(fn,interval=300){

letflag=true

returnfunction(...args){

if(!flag)return

flag=f

温馨提示

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

评论

0/150

提交评论