2026-10-30 13:36:17
途虎养车前端二面核心考察点涵盖JavaScript/TypeScript基础、项目与实习经验、算法能力,需针对性准备以下内容:
一、JavaScript 核心知识作用域
定义:变量与函数的可访问范围,分为全局作用域、函数作用域、块级作用域(ES6新增)。
关键点:
函数内部可直接读取全局变量,但全局无法访问函数内变量(除非变量显式返回或挂载到全局对象)。
块级作用域({}内)通过let/const实现,避免变量泄漏到外部。
作用域链:函数查找变量时从当前作用域向外层逐级搜索,直到全局作用域。
变量提升
现象:变量声明(var)或函数声明会被提升到当前作用域顶部,赋值保留在原位置。
示例:
console.log(a); // undefined(变量提升,仅声明被提升)var a = 1;foo(); // 正常执行(函数整体提升)function foo() { console.log('foo'); }let/const与var的区别:
let/const存在暂时性死区(TDZ),声明前访问会报错。
var可重复声明,let/const不可。
let/const/var对比
var:函数作用域,变量提升,可重复声明。
let:块级作用域,无变量提升,不可重复声明,可重新赋值。
const:块级作用域,无变量提升,不可重复声明,不可重新赋值(对象/数组内容可修改)。
TS优点
静态类型检查:编译时捕获类型错误,减少运行时异常。
代码可维护性:类型注解明确变量/函数参数类型,便于团队协作。
IDE支持:智能提示、自动补全,提升开发效率。
面向对象特性:支持接口、泛型、枚举等,适合大型项目。
类型推断失败处理
场景:TS无法自动推断复杂类型(如联合类型、函数返回值类型)。
解决方案:
显式声明类型:let num: number | string = '123';
使用类型断言:const input = document.getElementById('input') as HTMLInputElement;
类型守卫:通过typeof、instanceof等缩小类型范围。
TS常见类型
基础类型:number、string、boolean、null、undefined、symbol、bigint。
复杂类型:
对象类型:{ name: string; age: number }
数组类型:number[] 或 Array<number>
元组类型:[string, number](固定长度与类型)
枚举类型:enum Color { Red, Green }
联合类型:string | number
交叉类型:interface A { a: number } & interface B { b: string }
泛型类型:function identity<T>(arg: T): T { return arg; }
全局守卫:
beforeEach:每次路由跳转前触发,常用于鉴权。
afterEach:跳转完成后触发,如修改页面标题。
路由独享守卫:beforeEnter,仅在特定路由配置中生效。
组件内守卫:
beforeRouteEnter:进入组件前触发(无法访问this,可通过next(vm => {})访问组件实例)。
beforeRouteUpdate:路由参数变化时触发(如动态路由/user/:id)。
beforeRouteLeave:离开组件前触发,常用于表单未保存提示。
重点描述技术选型原因(如为何选择Vue/React)、遇到的挑战及解决方案。
示例:
性能优化:通过虚拟滚动(Virtual Scroll)优化长列表渲染。
状态管理:使用Redux/Vuex管理全局状态,说明数据流设计。
突出团队协作、代码规范、测试流程等软技能。
示例:
代码审查:参与PR评审,学习他人代码风格与优化思路。
自动化测试:编写单元测试(Jest)或E2E测试(Cypress),提升代码可靠性。
巩固JS基础(作用域、闭包、原型链)、TS类型系统、路由守卫原理。
梳理项目中的技术难点与优化点,准备1-2个详细案例。
练习常见算法题(如LIS、二分查找、链表操作)。
对不熟悉的问题(如路由守卫)可承认不足,但需展示学习思路。
手撕代码时先明确需求,边写边解释逻辑,注意边界条件。