JavaScript面试题精选

2025年 阅读约 13 分钟 面试指南 · 前端面试

精选JavaScript面试高频题目,涵盖闭包、原型链、异步编程、ES6+新特性等核心知识点,附详细解答。

一句话总结

JavaScript 是前端面试的基础,核心考点:闭包(函数+词法环境,私有变量/柯里化)、原型链(__proto__→prototype→Object.prototype→null)、异步(Promise三状态+async/await+事件循环微任务优先)、ES6+(let/const块级作用域+箭头函数+解构+可选链)。

闭包与作用域

Q:什么是闭包?有哪些应用场景?

闭包是指一个函数能够访问其外部函数作用域中的变量,即使外部函数已经执行完毕。闭包的本质是函数与其词法环境的组合。

应用场景:
1. 数据私有化:模块模式中的私有变量
2. 回调函数:事件处理、定时器
3. 函数柯里化:部分求值
4. 防抖节流:控制函数执行频率

注意:闭包会导致外部函数的变量无法被回收,过度使用可能造成内存泄漏。

原型链

Q:解释JavaScript的原型链?

每个对象都有一个内部属性[[Prototype]],指向其原型对象。当访问对象的属性时,如果对象本身没有该属性,就会沿着原型链向上查找,直到找到该属性或到达null。

原型链终点:Object.prototype.__proto__ === null

__proto__与prototype的区别:
- __proto__是对象的属性,指向创建该对象的构造函数的prototype
- prototype是函数的属性,是一个对象,包含共享的属性和方法

异步编程

Q:Promise、async/await的区别和原理?

Promise:ES6引入的异步解决方案,三种状态:pending→fulfilled/rejected。通过.then()链式调用处理结果。

async/await:ES2017引入的语法糖,让异步代码看起来像同步代码。async函数返回Promise,await暂停执行直到Promise完成。

事件循环:JavaScript通过事件循环实现异步。执行栈清空后,先检查微任务队列(Promise.then、MutationObserver),再检查宏任务队列(setTimeout、setInterval)。

ES6+核心特性

Q:let/const/var的区别?

var:函数作用域,有变量提升,可重复声明。

let:块级作用域,有暂时性死区(TDZ),不可重复声明。

const:块级作用域,声明时必须初始化,不可重新赋值(但对象属性可修改)。

其他重要特性:解构赋值、展开运算符、模板字符串、Symbol、Map/Set、Proxy/Reflect、可选链(?.)、空值合并(??)。

实战场景

场景:手写 Promise.all

// Promise.all:全部成功才成功,一个失败就失败 function promiseAll(promises) { return new Promise((resolve, reject) => { if (!Array.isArray(promises)) { return reject(new TypeError('参数必须是数组')); } const results = []; let count = 0; if (promises.length === 0) return resolve(results); promises.forEach((p, index) => { Promise.resolve(p).then(value => { results[index] = value; // 保持顺序 count++; if (count === promises.length) resolve(results); }, reject); // 任一失败直接 reject }); }); } // 测试 promiseAll([ Promise.resolve(1), Promise.resolve(2), Promise.resolve(3) ]).then(console.log); // [1, 2, 3]