ES6+✅
递归和尾递归是什么概念?
答案
- 递归:函数调用自身,通常用于分解问题。每次递归会创建新的调用栈帧,若无终止条件会导致栈溢出。
- 尾递归:递归调用是函数的最后一步,返回递归结果,无需保留当前帧。理论上可被优化为循环,避免栈溢出(JS 目前主流引擎未实现优化)。
实时编辑器
// 普通递归 function factorial (n) { if (n === 0) return 1 return n * factorial(n - 1) } // 尾递归 function factorialTail (n, result = 1) { if (n === 0) return result return factorialTail(n - 1, n * result) }
结果
Loading...
答案解析
尾递归可优化性能,减少栈空间消耗,但 JS 引擎实际支持有限。
面试官视角
- 核心考察点:能否区分递归与尾递归
- 评分标准:
- 差:只会写递归
- 优:能举例说明尾递归优化原理
JS 严格模式为什么禁用 with 语句?
答案
严格模式禁用 with 语句,原因有三:
- 性能问题:with 让作用域链不确定,阻碍 JS 引擎优化。
- 可读性差:with 会引入命名冲突,代码难以维护。
- 易出错:with 可能导致变量意外变为全局变量或覆盖局部变量,增加 bug 风险。
实时编辑器
const person = { name: 'Alice', age: 25 } function updatePerson (person) { // with (person) { name = 'Bob' // 实际创建了全局变量 name // } } updatePerson(person) console.log(window.name) // 'Bob'
结果
Loading...
答案解析
with 破坏作用域链和变量查找规则,易引发难以排查的 bug,严格模式下直接报错。
面试官视角
- 核心考察点:能否说出 with 的危害
- 评分标准:
- 差:只会用 with
- 优:能结合作用域和全局变量说明
stage0、stage1、stage2、stage3 分别代表什么含义?
答案
- Stage 0:草案阶段,任何想法都可提交,未被 TC39 正式采纳。
- Stage 1:提案阶段,有负责人和初步方案,值得进一步探讨。
- Stage 2:草案阶段,规范文本基本完成,有实验性实现。
- Stage 3:候选阶段,规范稳定,等待社区和实现者反馈。
- Stage 4:完成阶段,正式纳入 ECMAScript 标准。
答案解析
理解提案流程有助于判断新特性的稳定性和可用性。
面试官视角
- 核心考察点:能否说出各阶段含义
- 评分标准:
- 差:只知 ES6/ES7
- 优:能结合实际举例
装饰器(Decorator)是什么?如何实现?
答案
- 装饰器是一种特殊语法,用于动态修改类、方法、属性等的行为,本质是函数。
- 常用于日志、权限、缓存、AOP 等场景。
- 目前为 ECMAScript 提案,需 Babel 等工具支持。
实时编辑器
function timer(target, name, descriptor) { const original = descriptor.value descriptor.value = function (...args) { console.time(name) const result = original.apply(this, args) console.timeEnd(name) return result } return descriptor } class MyClass { @timer myMethod() { // do something } }
结果
Loading...
答案解析
装饰器让类的扩展更灵活,便于实现横切关注点(如日志、权限)。
面试官视角
- 核心考察点:能否说出装饰器原理和应用场景
- 评分标准:
- 差:只会用,不知原理
- 优:能写简单实现并举例