途虎养车前端二面

途虎养车前端二面
最新回答
路人

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:块级作用域,无变量提升,不可重复声明,不可重新赋值(对象/数组内容可修改)。

二、TypeScript 重点知识
  • 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; }

三、路由守卫(Vue Router/React Router)
  • 定义:在路由跳转过程中执行的全局、路由独享或组件内逻辑,用于权限控制、数据预加载等。
  • 用途:

    全局守卫:

    beforeEach:每次路由跳转前触发,常用于鉴权。

    afterEach:跳转完成后触发,如修改页面标题。

    路由独享守卫:beforeEnter,仅在特定路由配置中生效。

    组件内守卫:

    beforeRouteEnter:进入组件前触发(无法访问this,可通过next(vm => {})访问组件实例)。

    beforeRouteUpdate:路由参数变化时触发(如动态路由/user/:id)。

    beforeRouteLeave:离开组件前触发,常用于表单未保存提示。

四、项目与实习经验准备
  • 项目细节

    重点描述技术选型原因(如为何选择Vue/React)、遇到的挑战及解决方案。

    示例:

    性能优化:通过虚拟滚动(Virtual Scroll)优化长列表渲染。

    状态管理:使用Redux/Vuex管理全局状态,说明数据流设计。

  • 实习工作细节

    突出团队协作、代码规范、测试流程等软技能。

    示例:

    代码审查:参与PR评审,学习他人代码风格与优化思路。

    自动化测试:编写单元测试(Jest)或E2E测试(Cypress),提升代码可靠性。

五、算法题:最长递增子序列长度(LIS)
  • 问题描述:给定数组,找到一个最长的严格递增子序列的长度。
  • 解法示例(动态规划):function lengthOfLIS(nums) { if (nums.length === 0) return 0; const dp = new Array(nums.length).fill(1); // dp[i]表示以nums[i]结尾的LIS长度 for (let i = 1; i < nums.length; i++) { for (let j = 0; j < i; j++) { if (nums[i] > nums[j]) { dp[i] = Math.max(dp[i], dp[j] + 1); } } } return Math.max(...dp);}
  • 优化:二分查找法可将时间复杂度从O(n2)降至O(n log n)。
六、总结建议
  • 复习重点:

    巩固JS基础(作用域、闭包、原型链)、TS类型系统、路由守卫原理。

    梳理项目中的技术难点与优化点,准备1-2个详细案例。

    练习常见算法题(如LIS、二分查找、链表操作)。

  • 面试技巧:

    对不熟悉的问题(如路由守卫)可承认不足,但需展示学习思路。

    手撕代码时先明确需求,边写边解释逻辑,注意边界条件。