- 1
- 0
- 约2.27千字
- 约 4页
- 2025-10-16 发布于河北
- 举报
JS高频面试题及答案
1.请解释原型链的概念,以及它在实际开发中的作用?
答案:
原型链是JS实现继承的核心机制。每个对象都有__proto__(隐式原型),指向其构造函数的prototype(显式原型);当访问对象属性时,若自身没有,会顺着__proto__向上查找,直到Object.prototype(原型链顶端),这个查找链条就是原型链。
实际作用:
实现代码复用:比如给Array.prototype添加自定义方法,所有数组实例都能直接调用(例:Array.prototype.myMap=function(){...});
实现继承:比如通过Child.prototype.__proto__=Parent.prototype让子类继承父类原型上的方法,避免重复定义;
注意点:避免直接修改原生对象原型(如Object.prototype),可能污染全局环境,引发冲突。
2.闭包是什么?实际开发中你用闭包解决过哪些问题?需要注意什么?
答案:
闭包是指函数能访问其定义时所在的作用域(外层作用域)的变量,即使函数在外部执行。本质是作用域链的保留。
实际应用场景:
封装私有变量:比如实现计数器(例:functioncreateCounter(){letcount=0;return()=count++;}),外部无法直接修改count;
防抖节流:比如输入框搜索防抖,用闭包保存定时器ID,避免每次触发都创建新定时器;
模块化:早期没有ES6Module时,用闭包包裹代码,暴露指定接口,避免变量污染全局(如(function(){...})())。
注意点:
内存泄漏风险:若闭包长期持有外部变量(如DOM元素),且不主动释放,可能导致内存无法回收;解决方式:使用完后将引用设为null(例:letelem=null);
性能影响:过度使用闭包会增加作用域查找开销,需合理场景使用。
3.请对比Promise、async/await和回调函数,说说它们的优缺点及使用场景?
答案:
三者都是JS处理异步的方式,核心是解决“回调地狱”(嵌套回调导致代码难维护)。
方式
优点
缺点
适用场景
回调函数
简单直观,原生支持
嵌套深时代码混乱(回调地狱)
简单异步场景(如setTimeout)
Promise
链式调用,解决回调地狱
无法中断,错误捕获需用catch
并行异步任务(如Promise.all)
async/await
同步代码风格,易读易维护
需配合try/catch捕获错误
复杂异步流程(如多接口依赖)
示例:
Promise链式调用:fetch(url).then(res=res.json()).then(data=console.log(data)).catch(err=console.log(err));
async/await:asyncfunctiongetDate(){try{constres=awaitfetch(url);constdata=awaitres.json();}catch(err){...}}。
4.事件循环(EventLoop)的机制是什么?请分析以下代码的执行顺序:
console.log(1);
setTimeout(()=console.log(2),0);
newPromise((resolve)={
console.log(3);
resolve();
}).then(()=console.log(4));
console.log(5);
答案:
事件循环是JS处理异步任务的核心机制,因为JS是单线程,需通过“主线程+任务队列”实现非阻塞:
同步任务优先在主线程执行,执行完后读取“微任务队列”;
微任务(Promise.then、process.nextTick等)全部执行完后,再读取“宏任务队列”(setTimeout、DOM事件等);
重复以上步骤,形成事件循环。
代码执行顺序:1→3→5→4→2
同步任务:console.log(1)、newPromise里的console.log(3)、console.log(5)先执行;
微任务:Promise.then(console.log(4))在同步任务后执行;
宏任务:setTimeout(console.log(2))在微任务全部执行后执行。
5.let、const和var的区别是什么?实际开发中你更推荐用哪两个?为什么?
答案:
三者都是声明变量的关键字,核心区别在作用域、变量提升、重复声明和赋值限制:
关键字
作用域
变量提升
重
原创力文档

文档评论(0)