一句话总结
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、可选链(?.)、空值合并(??)。