Shopee前端校招一面问题解答如下:
1. Vue2和Vue3的区别- 响应式原理:Vue2使用Object.defineProperty实现响应式,存在数组监听和新增属性监听不完整的问题;Vue3改用Proxy,支持全类型监听且性能更高。
- 组合式API:Vue3引入setup函数和Composition API,逻辑复用更灵活,替代Vue2的Options API。
- 编译优化:Vue3的编译器通过静态节点标记和块树优化,减少运行时开销,渲染性能提升约1.3-2倍。
- 其他改进:支持Fragment(多根节点)、Teleport(组件穿透)、自定义渲染器等,TypeScript支持更完善。
2. React和Vue的区别- 设计理念:React推崇函数式编程和单向数据流,强调灵活性和可控性;Vue采用渐进式框架设计,更易上手。
- 响应式系统:React通过状态管理(如useState)触发重新渲染,Vue通过数据劫持自动追踪依赖。
- 模板语法:React使用JSX,将HTML嵌入JS;Vue使用模板语法(类似HTML),支持指令(如v-if)。
- 生态与扩展:React生态更庞大(如Redux、React Router),适合复杂应用;Vue生态更轻量(如Vuex、Vue Router),适合快速开发。
3. React和Vue的适用场景及判断依据- 选择React的场景:
需要高度动态化的UI(如数据可视化、复杂交互)。
团队熟悉函数式编程或已有React生态项目。
长期维护的大型项目,需灵活控制渲染逻辑。
- 选择Vue的场景:
快速原型开发或中小型项目。
团队偏好模板语法和渐进式学习曲线。
需要内置动画、状态管理等开箱即用功能。
- 判断依据:项目规模、团队技术栈、开发效率需求、长期维护成本。
4. WeakMap的特性- 键必须是对象:WeakMap的键只能是对象(非原始值),值可以是任意类型。
- 弱引用:键是弱引用,若键对象无其他引用,会被垃圾回收机制回收,避免内存泄漏。
- 不可枚举:WeakMap没有size属性,也无法遍历键值对,保证隐私性。
- 适用场景:存储私有数据(如类实例的私有属性)、缓存依赖对象的数据。
5. 自动填充(搜索框)的实现方式- HTML5的datalist标签:<input list="suggestions" /><datalist id="suggestions"> <option value="选项1" /> <option value="选项2" /></datalist>
- 前端模拟:监听输入事件,通过AJax请求后端接口或本地数据过滤,动态显示下拉列表。
- 浏览器自动填充:利用浏览器保存的表单数据(如用户名、密码),需设置autocomplete属性:<input autocomplete="username" />
6. 防抖(Debounce)- 定义:触发事件后,等待一定时间(如500ms)再执行,若期间再次触发则重新计时。
- 应用场景:搜索框输入联想、窗口resize事件、滚动事件优化。
- 代码示例:function debounce(fn, delay) { let timer = null; return function(...args) { clearTimeout(timer); timer = setTimeout(() => fn.apply(this, args), delay); };}
7. 前端跨域实现- CORS:后端设置响应头Access-Control-Allow-Origin,允许特定域名访问。
- JSONP:利用<script>标签不受同源策略限制,仅支持GET请求。
- 代理服务器:开发环境配置webpack-dev-server代理,生产环境使用Nginx反向代理。
- postMessage:跨窗口通信(如iframe与父页面)。
8. iframe的跨域9. HTTP缓存:强缓存和协商缓存- 强缓存:
响应头:Cache-Control: max-age=3600(相对时间)或Expires(绝对时间)。
直接从本地缓存读取,不发起请求。
- 协商缓存:
响应头:Last-Modified(资源最后修改时间)或ETag(资源唯一标识)。
请求头:If-Modified-Since或If-None-Match,服务器对比后返回304或新资源。
10. JS异步- 回调函数:早期方式,易导致回调地狱。
- Promise:通过.then()链式调用,支持catch错误处理。
- Async/Await:基于Promise的语法糖,使异步代码像同步一样书写。async function fetchData() { try { const res = await fetch('url'); const data = await res.json(); } catch (e) { console.error(e); }}
11. 消息队列12. 页面渲染LeetCode 16、18、1696题(需具体题目描述)- 题16(最接近的三数之和):排序后双指针夹逼,时间复杂度O(n2)。
- 题18(四数之和):类似三数之和,外层循环加双指针,注意去重。
- 题1696(跳跃游戏VI):动态规划或单调队列优化,记录最大值。
建议:针对算法题,需结合具体题目描述分析边界条件和优化思路,面试前可重点练习双指针、动态规划等高频题型。