腾讯-CSIG一校招 · 第 1 轮 · 第二轮

← 第 1 轮 · 返回本次面经 · 已是最后一轮 → 本轮概述: 第二轮对技术深度有一定的考察。 对构建工具有深入理解,能够分析技术选型原因 掌握React核心概念和性能优化技巧 具备网络协议和安全知识 代码实现能力强,能够设计合理的算法和架构 理解设计模式在实际场景中的应用 本轮共 14 道题。答案默认折叠,便于先自行作答。 1. Node中间件的作用和使用 题目要点 请求拦截处理、横切关注点、链式执行、功能解耦 参考答案 中间件是在请求和响应之间执行的函数,用于处理横切关注点。在Express/Nest.js中,中间件按顺序执行,每个中间件可以修改请求对象、响应对象,或者终止请求-响应循环。 常用的中间件包括: 身份验证中间件:验证用户token 日志中间件:记录请求信息 错误处理中间件:统一处理异常 CORS中间件:处理跨域请求 参数验证中间件:验证请求参数格式 2. 大模型的理解和应用 题目要点 语言模型、涌现能力、开发辅助、安全考虑 参考答案 大模型是基于Transformer架构的深度学习模型,通过大规模数据训练获得强大的语言理解和生成能力。主要特点是参数量巨大、涌现能力强、通用性好。 在开发中的应用: 代码生成和补全:提高开发效率 文档生成:自动生成API文档和注释 代码审查:发现潜在问题和优化建议 需求分析:辅助理解业务逻辑 使用时需要注意数据安全、结果准确性验证、成本控制等问题。 3. Webpack vs Vite 的理解和区别 题目要点 构建原理差异、性能表现、生态成熟度、配置复杂度 参考答案 Webpack是基于模块打包的构建工具,通过入口文件分析依赖关系,将所有资源打包成bundle。Vite是基于ES模块的构建工具,开发时利用浏览器原生ES模块支持,生产时使用Rollup打包。 主要区别: 启动速度:Vite利用ES模块按需加载,启动更快;Webpack需要预先打包 热更新:Vite基于ES模块的HMR更精确;Webpack需要重新打包相关模块 生态系统:Webpack生态更成熟,插件丰富;Vite相对较新但发展迅速 配置复杂度:Vite开箱即用,配置简单;Webpack配置相对复杂 4. 项目选择构建工具的考虑 题目要点 开发体验优先、项目延续性、团队熟悉度、稳定性考虑 参考答案 个人项目选择Vite主要考虑开发体验,启动快、热更新迅速,配置简单,适合快速原型开发。实习项目使用Webpack主要因为: 历史项目延续性,已有完整的配置和工作流 团队熟悉度高,维护成本低 生态系统成熟,特殊需求的插件支持更好 大型项目的稳定性考虑 5. Vite 开发环境与生产环境差异 题目要点 按需加载vs完整打包、开发体验vs生产优化、不同构建工具 参考答案 开发环境: ...

July 28, 2025

京东-零售-实习 · 第 1 轮 · 第一轮

← 已是第一轮 · 返回本次面经 · 已是最后一轮 → 本轮概述: 主要考察前端基础,难度不大。 本轮共 14 道题。答案默认折叠,便于先自行作答。 1. 自我介绍 题目要点 突出专业背景、技术栈掌握情况、学习能力和求职意向,简洁明了地展现个人优势。 参考答案 本科就读于XXX大学计算机科学与技术专业,在校期间系统学习了前端开发相关技术栈,包括HTML、CSS、JavaScript基础,以及React、Vue等现代框架。通过课程项目和个人实践,积累了一定的开发经验。 在技术方面,熟练掌握ES6+语法、响应式布局、组件化开发思想,了解前端工程化工具如Webpack、Vite的使用。同时对前端性能优化、用户体验提升有一定认识。 学习能力较强,能够快速适应新技术和开发环境,具备良好的问题分析和解决能力。希望能够加入贵公司,在实际项目中进一步提升技术水平,为团队贡献价值。 2. 说一说做过的项目中的难点和亮点 题目要点 通过具体的技术难题展现问题解决能力,用数据量化优化效果,体现技术深度和实践价值。 参考答案 难点: 在开发电商类项目时,遇到了商品列表的性能问题。当商品数据量达到几千条时,页面渲染明显卡顿。通过分析发现是频繁的DOM操作和重复渲染导致的。 解决方案是实现了虚拟滚动技术,只渲染可视区域内的商品项,配合防抖优化搜索功能,最终将首屏渲染时间从3秒优化到800毫秒。 亮点: 设计了一套可复用的表单验证组件库。通过高阶组件模式封装了常见的验证逻辑,支持链式调用和自定义验证规则。这套组件在后续项目中被多次复用,提高了开发效率约30%。 3. 手写秒杀倒计时组件 题目要点 实现了完整的倒计时功能,包括时间计算、格式化显示、状态管理和生命周期处理,考虑了边界情况和用户体验。 参考答案 "use client" import type React from "react" import { useState, useEffect, useCallback } from "react" interface CountdownProps { targetTimestamp: number // 目标时间戳(毫秒) onEnd?: () => void // 倒计时结束回调 } interface TimeLeft { days: number hours: number minutes: number seconds: number } const Countdown: React.FC<CountdownProps> = ({ targetTimestamp, onEnd }) => { const [timeLeft, setTimeLeft] = useState<TimeLeft>({ days: 0, hours: 0, minutes: 0, seconds: 0 }) const [isActive, setIsActive] = useState(true) const calculateTimeLeft = useCallback((): TimeLeft => { const now = Date.now() const difference = targetTimestamp - now if (difference <= 0) { setIsActive(false) onEnd?.() return { days: 0, hours: 0, minutes: 0, seconds: 0 } } const days = Math.floor(difference / (1000 * 60 * 60 * 24)) const hours = Math.floor((difference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) const minutes = Math.floor((difference % (1000 * 60 * 60)) / (1000 * 60)) const seconds = Math.floor((difference % (1000 * 60)) / 1000) return { days, hours, minutes, seconds } }, [targetTimestamp, onEnd]) useEffect(() => { if (!isActive) return const timer = setInterval(() => { setTimeLeft(calculateTimeLeft()) }, 1000) // 初始化时立即计算一次 setTimeLeft(calculateTimeLeft()) return () => clearInterval(timer) }, [calculateTimeLeft, isActive]) const formatNumber = (num: number): string => { return num.toString().padStart(2, "0") } if (!isActive) { return ( <div className="countdown-container"> <span className="countdown-ended">秒杀已结束</span> </div> ) } return ( <div className="countdown-container"> <div className="countdown-wrapper"> {timeLeft.days > 0 && ( <> <div className="time-unit"> <span className="time-number">{formatNumber(timeLeft.days)}</span> <span className="time-label">天</span> </div> <span className="separator">:</span> </> )} <div className="time-unit"> <span className="time-number">{formatNumber(timeLeft.hours)}</span> <span className="time-label">时</span> </div> <span className="separator">:</span> <div className="time-unit"> <span className="time-number">{formatNumber(timeLeft.minutes)}</span> <span className="time-label">分</span> </div> <span className="separator">:</span> <div className="time-unit"> <span className="time-number">{formatNumber(timeLeft.seconds)}</span> <span className="time-label">秒</span> </div> </div> </div> ) } // 使用示例 const App: React.FC = () => { // 设置一个5分钟后的时间戳 const targetTime = Date.now() + 5 * 60 * 1000 const handleCountdownEnd = () => { console.log("秒杀活动结束") } return ( <div className="app"> <h1>京东秒杀倒计时</h1> <Countdown targetTimestamp={targetTime} onEnd={handleCountdownEnd} /> </div> ) } export default App 4. 当前项目还有哪些可以优化的地方 题目要点 从性能、体验、质量三个维度分析优化空间,体现对项目全局的思考和持续改进意识。 ...

July 28, 2025

阿里巴巴-社招-5年 · 第 1 轮 · HR面

← 第 1 轮 · 返回本次面经 · 已是最后一轮 → 本轮共 7 道题。答案默认折叠,便于先自行作答。 1. 离职的原因是什么 题目要点 略 参考答案 略 2. 你熟悉 VUE 吗 题目要点 略 参考答案 略 3. 学习一些新技术,或者是业务中碰到的一些难题,你是针对性去解决会比较多一些,还是说你有系统的学习的一些规划呢 题目要点 略 参考答案 略 4. 工作过程中哪些成长比较大,遇到过哪些难题,怎么解决的 题目要点 略 参考答案 略 5. 你们的加班强度怎么样 题目要点 略 参考答案 略 6. 你如何看待团队合作 题目要点 略 参考答案 略 7. 离职的时候你怎么处理跟前同事的关系的 题目要点 略 参考答案 略 ← 第 1 轮 · 返回本次面经 · 已是最后一轮 →

July 28, 2025

阿里巴巴-社招-5年 · 第 1 轮 · 三面

← 第 1 轮 · 返回本次面经 · 第 1 轮 → 本轮共 7 道题。答案默认折叠,便于先自行作答。 1. 请用3分钟介绍魔方组件项目,突出技术决策过程 题目要点 略 参考答案 略 2. 项目中遇到的最大技术挑战及解决思路 题目要点 略 参考答案 略 3. 性能优化项目的ROI如何评估 题目要点 性能优化 ROI 是投入产出比的度量,结合成本和业务收益评估 需明确优化目标、估算投入、预估收益,计算合理 ROI 关注性能指标与业务指标的映射关系,结合数据分析 兼顾技术收益和用户体验提升,避免盲目优化 持续跟踪优化效果,动态调整投资策略 参考答案 一、考察点 理解性能优化的投入与收益关系 掌握定量和定性评估性能优化效果的方法 了解业务指标与性能指标的关联性 能结合项目实际情况合理规划和衡量优化价值 二、参考答案 2.1 ROI 的定义与核心思想 ROI(Return on Investment)即“投资回报率”,衡量投入资源与产出收益的比率 性能优化的 ROI 评估即衡量优化投入(时间、人力、成本)与带来的业务或技术收益是否成正比 目标是确保资源有效利用,避免盲目优化 2.2 性能优化投入的量化 开发成本:开发和测试性能优化方案所需的人力、时间 基础设施成本:可能新增的硬件资源或第三方服务开销 维护成本:优化方案上线后的维护和升级投入 2.3 性能优化收益的量化 业务指标提升:如转化率、用户留存率、页面访问量、用户满意度等 技术指标改善:首屏时间(FCP)、最大内容渲染时间(LCP)、交互响应时间、错误率降低等 运营成本降低:服务器压力减轻、带宽节省、用户投诉减少等 2.4 关联业务价值与性能指标 通过数据分析建立性能指标与业务指标的映射关系,比如: 首屏加载时间缩短 1 秒,转化率提升 5% 页面响应延迟减少,用户流失率降低 结合历史数据或行业调研,预估性能改进带来的经济效益 2.5 评估流程示例 明确优化目标:确定需优化的性能瓶颈和预期改进幅度 估算投入成本:评估开发时间、人力、资源等投入 预估收益:基于数据和业务指标推算收益大小 计算 ROI:收益 / 投入,判断是否值得投资 持续监控:优化上线后跟踪实际效果,调整策略 2.6 风险与非量化因素考虑 用户体验提升虽难量化,但对品牌和用户粘性极重要 竞争压力、市场趋势等外部因素可能影响 ROI 技术债务减少,长期维护成本降低也是重要收益 三、常见误区或面试陷阱 ❌ 只关注技术指标优化,忽视业务价值转化 ❌ 低估开发和维护成本,导致投入超出预期 ❌ 盲目追求极致性能,忽略边际效益递减 ❌ 缺乏数据支持,ROI 评估主观臆断 4. 项目风险遇到过哪些 ,怎么解决的 题目要点 略 ...

July 28, 2025

阿里巴巴-社招-5年 · 第 1 轮 · 二面

← 第 1 轮 · 返回本次面经 · 第 1 轮 → 本轮要点: 浏览器的缓存机制、react hooks 本轮共 11 道题。答案默认折叠,便于先自行作答。 1. 魔方组件的整体架构设计,包括其模块划分和核心功能 题目要点 略 参考答案 略 2. 你们是如何选择技术栈的?有哪些关键因素影响了决策 题目要点 略 参考答案 略 3. 魔方组件如何实现动态加载,以提升初始加载性能 题目要点 略 参考答案 略 4. 魔方组件如何管理组件的配置信息?组件之间的通信是如何处理的 题目要点 略 参考答案 略 5. 三维模型的加载性能,将加载时间从10秒缩短至3秒都做了哪些操作 题目要点 略 参考答案 略 6. 这个项目中在移动端,你们是如何处理不同设备的适配问题的 题目要点 略 参考答案 略 7. 有没有用服务端渲染(SSR)?如果有,你们是如何实现的 题目要点 SSR 是服务器预先渲染页面,提高首屏性能和 SEO 常用框架有 Next.js、Nuxt.js,也可自研实现 实现时结合服务器渲染和客户端 Hydration 完成完整页面交互 需处理代码共享、数据预取、样式加载及性能优化 了解 SSR 的局限性和优化难点,合理权衡使用场景 参考答案 一、考察点 理解 SSR 的基本概念和优势 掌握常见 SSR 实现方案及其原理 理解 SSR 与客户端渲染(CSR)的区别和协同方式 了解 SSR 在项目中的具体落地方法和技术选型 二、参考答案 2.1 SSR 的基本概念 SSR(Server-Side Rendering)是指在服务器端完成页面的 HTML 渲染,再将完整的 HTML 返回给客户端 相比纯客户端渲染,SSR 提升了首屏渲染速度和 SEO 友好性 用户拿到的是已渲染好的页面,浏览器可以更快显示内容 2.2 SSR 的优势和适用场景 首屏速度快:浏览器无需等待大量 JS 执行即可显示页面 SEO 优化:搜索引擎能抓取到完整的内容,提升排名 社交分享友好:分享链接时可显示完整预览 适合内容型或公共站点,电商、新闻、博客等场景 2.3 常见 SSR 实现方案 Next.js(React):提供开箱即用的 SSR 支持和静态生成 Nuxt.js(Vue):Vue 生态的 SSR 框架,支持服务端渲染和静态导出 自研 SSR:使用 Node.js 搭配 ReactDOMServer 或 Vue SSR API 手动实现 传统模板引擎:如 EJS、Handlebars 等,服务器渲染 HTML 2.4 我们项目中 SSR 的实现方式 使用了 [Next.js / Nuxt.js / 自研 SSR] 作为 SSR 框架 服务器通过 Node.js 环境调用 ReactDOMServer.renderToString 或 Vue SSR 的 renderToString,生成完整 HTML 结合路由系统,实现根据请求 URL 渲染对应页面 页面返回时携带初始数据(通过服务端数据预取),客户端接管 Hydration,实现页面交互 结合缓存策略,优化性能和响应速度 配合 Webpack 和 Babel,保证服务端代码和客户端代码一致性 2.5 实现过程中需注意的问题 服务端和客户端代码共享及差异处理(避免浏览器 API 直接调用) 初始数据的获取与注入,保证页面完整性和交互 处理样式加载,避免闪烁(FOUC) 性能优化,如页面缓存、资源压缩和异步加载 服务器负载和扩展性考虑 三、常见误区或面试陷阱 ❌ 认为 SSR 只是在服务器渲染静态 HTML,忽略客户端 Hydration ❌ 忽视服务端渲染的性能开销和状态同步难题 ❌ 直接复用客户端代码,未处理服务端无 DOM 的环境差异 ❌ 忽略 SEO 以外的性能和用户体验提升点 8. 项目中使用了哪些状态管理工具?为什么选择这些工具 题目要点 状态管理工具选择基于项目规模、团队经验和性能需求 Redux 适合大型复杂应用,MobX 适合响应式需求 Context 适合轻量局部状态管理 结合工具生态和中间件支持,提升开发效率和维护性 合理划分全局与局部状态,避免状态管理复杂化 参考答案 一、考察点 理解不同状态管理工具的特点及适用场景 掌握项目中选择状态管理工具的决策逻辑 能清晰阐述所选工具带来的优势和解决的问题 了解状态管理的基本概念和复杂度控制方法 二、参考答案 2.1 项目中使用的状态管理工具 Redux 适用于大型复杂应用,状态集中管理 具备时间旅行调试、可预测状态变更、丰富中间件生态 MobX 响应式状态管理,自动追踪依赖,适合数据驱动视图更新 代码简洁,学习曲线较低 React Context + useReducer/useState 轻量级状态共享方案,适合中小型或局部状态管理 Recoil / Zustand / Valtio 等轻量方案 现代灵活的状态管理,适合部分场景需求 Vuex(Vue 项目) Vue 官方状态管理库,集中管理全局状态,支持插件扩展 2.2 选择这些工具的理由 项目规模与复杂度 ...

July 28, 2025

阿里巴巴-社招-5年 · 第 1 轮 · 一面

← 已是第一轮 · 返回本次面经 · 第 1 轮 → 本轮要点: React 生命周期、react hooks、JSX、react 渲染机制、React函数组件更新、react 组件设计模式 本轮共 38 道题。答案默认折叠,便于先自行作答。 1. 你参与的主要项目是什么?是桌面端还是移动端项目 题目要点 略 参考答案 略 2. 在项目中主要使用了哪些技术栈 题目要点 略 参考答案 略 3. 你对 Vue 有多少了解 题目要点 Vue 是数据驱动 + 响应式的组件化框架,适合快速构建中大型项目 熟悉其核心机制:响应式原理、组件生命周期、指令语法、虚拟 DOM 掌握 Vue Router、Vuex/Pinia 等配套生态工具 能区分并熟练使用 Vue 2 和 Vue 3 的开发模式 具备优化性能、提升可维护性的工程意识 参考答案 一、考察点 探查候选人对 Vue 核心原理、语法机制的理解深度 判断是否具备实战经验、组件开发能力、性能优化能力 涵盖响应式系统、组件通信、生命周期、指令系统、虚拟 DOM、Diff 等关键技术点 Vue 生态栈是否熟悉,如 Vue Router、Vuex / Pinia、Composition API、Vue 3 升级等 二、参考答案 2.1 Vue 框架的整体认知 Vue 是一个 轻量、渐进式的前端框架,核心关注 View 层,易学易用,适合快速开发中大型应用 支持响应式绑定、组件化开发、指令系统、虚拟 DOM、跨平台(如 H5、小程序) Vue 的核心组成包括: ...

July 28, 2025

阿里巴巴-社招-3年 · 第 1 轮 · 二面

← 第 1 轮 · 返回本次面经 · 已是最后一轮 → 本轮要点: react hooks、高阶组件、列表和key、react 渲染机制、react 组件设计模式、前端模块化、Webpack与Vite 本轮共 12 道题。答案默认折叠,便于先自行作答。 1. 讲一下你对Hooks 了解 题目要点 Hooks 是函数组件状态和副作用管理的新方案 常用 Hooks 有 useState、useEffect、useMemo、useCallback 等 Hook 调用必须遵循规则,保证顺序稳定 自定义 Hooks 用于逻辑复用,提高代码可维护性 理解 Hook 设计原理,有助于写出高质量 React 代码 参考答案 一、考察点 理解 React Hooks 的设计初衷与核心概念 掌握常用 Hooks(如 useState、useEffect、useMemo、useCallback 等)的作用与使用场景 理解 Hooks 规则及其背后的原理机制 认识 Hooks 对函数组件状态管理和生命周期的改进 了解自定义 Hooks 的设计思路及复用价值 二、参考答案 2.1 Hooks 的定义与设计初衷 定义:Hooks 是 React 16.8 引入的函数组件状态和副作用管理的特性 设计目标: 解决类组件中状态逻辑难以复用和组件嵌套过深的问题 让函数组件拥有类似类组件的状态和生命周期能力 简化组件逻辑,提升代码可读性和复用性 2.2 常用 Hooks 及其作用 Hooks 功能描述 典型使用场景 useState 在函数组件中声明状态变量 组件内部状态管理 useEffect 处理副作用(订阅、异步请求、DOM操作等) 替代类组件的生命周期钩子 useContext 订阅 React Context,实现跨组件数据传递 共享全局状态、主题、语言等 useMemo 记忆计算结果,避免不必要的重复计算 性能优化,避免昂贵计算重复执行 useCallback 记忆函数实例,避免子组件重复渲染 优化子组件性能,防止无意义的 props 变化 useRef 保存可变值,不触发组件重新渲染 访问 DOM 节点或保存不变引用 2.3 Hooks 的规则与原理 规则: 只能在函数组件或自定义 Hooks 中调用 只能顶层调用,不能在循环、条件或嵌套函数中调用,保证 Hook 调用顺序稳定 原理:React 通过维护一个 Hook 链表和调用顺序,关联 Hook 状态与对应组件实例,实现状态的持久化和更新 2.4 自定义 Hooks 将组件中可复用的状态逻辑抽象成函数 函数内部调用其他 Hooks,实现逻辑复用与拆分 提高代码复用性和可维护性 三、常见误区或面试陷阱 误用 Hook 规则,导致调用顺序不稳定 过度使用 useEffect,产生复杂副作用链和性能问题 误解 useMemo 和 useCallback 的使用时机和作用 忽略依赖项数组,导致副作用不正确执行 不了解自定义 Hooks 是普通函数,不能在其中调用 Hook 规则外的逻辑 2. 对比 Class 组件的 Mixin 模式,Hooks 如何解决逻辑复用问题?Mixin 的主要缺陷是什么 题目要点 Mixin 依赖多继承,存在命名冲突、状态污染、难维护等问题 Hooks 通过函数组合和自定义 Hook 实现逻辑复用,避免冲突和复杂继承 Hooks 提升代码可读性、维护性、测试性和类型支持 React 官方推荐使用 Hooks 替代 Mixin 模式 参考答案 一、考察点 理解 Class 组件中 Mixin 的工作方式及缺陷 掌握 Hooks 解决组件逻辑复用的机制和优势 比较两种方案在代码组织、维护性和复用性上的差异 理解现代 React 设计理念和组件开发最佳实践 二、参考答案 2.1 Mixin 模式及其缺陷 Mixin 定义:通过多个类混入(mixin)共享方法和状态,Class 组件通过继承或组合多个 mixin 实现代码复用 ...

July 28, 2025

阿里巴巴-社招-3年 · 第 1 轮 · 一面

← 已是第一轮 · 返回本次面经 · 第 1 轮 → 本轮要点: react 事件机制、React 生命周期、state 与 props 本轮共 13 道题。答案默认折叠,便于先自行作答。 1. 实现全屏水平垂直居中、宽高为屏幕宽度一半的正方形 题目要点 利用 vw 单位定义宽高,保证正方形且相对视口大小 Flexbox 和绝对定位 + transform 是常用居中方案 重置默认 margin 和设置容器高度保证布局准确 任选方案均可,Flexbox 代码简洁,绝对定位兼容性好 参考答案 一、考察点 掌握 CSS 布局基础知识 熟悉视口单位(vw、vh)的使用 理解水平垂直居中多种实现方式 了解盒模型和尺寸计算 二、参考答案 2.1 需求分析 元素宽度和高度为屏幕宽度的 50%(即 50vw) 元素是正方形,宽高相等 水平和垂直方向均居中显示 兼容主流现代浏览器 2.2 代码实现示例 方法一:使用 Flexbox <div class="container"> <div class="square"></div> </div> <style> html, body, .container { margin: 0; height: 100vh; display: flex; justify-content: center; /* 水平居中 */ align-items: center; /* 垂直居中 */ } .square { width: 50vw; height: 50vw; /* 保证正方形 */ background-color: #4CAF50; } </style> 方法二:使用绝对定位 + transform <div class="square"></div> <style> .square { position: absolute; top: 50%; left: 50%; width: 50vw; height: 50vw; background-color: #2196F3; transform: translate(-50%, -50%); } html, body { margin: 0; height: 100vh; } </style> 2.3 说明 50vw 表示视口宽度的一半 Flexbox 方案利用容器的弹性布局实现简单居中 绝对定位方案通过 top:50%, left:50% 定位中心点,再用 transform 修正偏移 两种方案均保证元素在视口中央且尺寸为屏幕宽度一半的正方形 三、常见误区或面试陷阱 忽略 viewport 单位,使用百分比 % 宽高导致高度受父元素限制 使用 margin: auto 只实现水平居中,未垂直居中 transform 偏移值写错方向或单位 未重置 html, body 的 margin 和高度,导致布局异常 2. 如何通过 padding-bottom 实现自适应正方形 题目要点 百分比 padding-bottom 是相对于元素宽度计算的 设置宽度,padding-bottom 等于宽度比例即可实现宽高比 纯 CSS 实现响应式正方形,无需 JS 计算 配合 position 及 transform 可实现内部内容居中 参考答案 一、考察点 理解 CSS 盒模型及百分比 padding 的计算规则 熟悉通过内边距(padding)比例实现自适应高度的布局技巧 掌握纯 CSS 无需固定高度实现宽高比控制的方法 了解响应式设计及视口适配相关概念 二、参考答案 2.1 核心原理说明 百分比 padding 的高度计算基于元素的宽度 例如,padding-bottom: 100% 表示内边距底部高度是元素自身宽度的 100% 利用这一特性,设置一个元素的宽度,然后用 padding-bottom 来控制高度,从而实现固定宽高比(正方形为 1:1) 这种方式不依赖固定高度或 JS,纯 CSS 实现响应式正方形 2.2 具体实现方式 <div class="square"></div> <style> .square { width: 50vw; /* 宽度为视口宽度的一半 */ padding-bottom: 50vw; /* 内边距底部为宽度的 100%,实现高度与宽度相等 */ background-color: #f60; position: relative; /* 便于放置绝对定位内容(如文字) */ } /* 如果需要内部内容绝对居中,可添加: */ .square > .content { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } </style> 2.3 使用场景 自适应正方形容器 图片或视频占位框 响应式卡片、图标区域布局 三、常见误区或面试陷阱 误以为 padding 百分比是基于高度计算(实际上是基于宽度) 忽略内容本身不占高度,需要通过 position: relative 和绝对定位解决内容布局 没有设置元素的 width,导致 padding 计算无意义 使用固定 height 反而破坏响应式效果 3. 若要求正方形内嵌图片保持比例且不拉伸,如何实现 题目要点 容器用 padding-bottom 创建自适应正方形 图片使用 object-fit: contain 保持比例且不拉伸 绝对定位图片居中显示,宽高100%填充容器 设置 overflow: hidden 避免溢出 参考答案 一、考察点 理解图片的默认渲染行为及尺寸适配 掌握 CSS 中图片等媒体对象的缩放控制属性(object-fit) 熟悉容器布局,确保图片在固定宽高正方形内自适应显示 了解响应式设计和兼容性考虑 二、参考答案 2.1 核心概念说明 图片默认行为:图片按原始宽高比显示,若强制设置宽高可能导致变形 object-fit 属性:用于控制替换元素(如 img、video)内容的填充方式 object-fit: contain 保持图片比例,完整显示,可能留空白 object-fit: cover 保持比例,填满容器,超出部分裁剪 结合容器尺寸和 object-fit 可灵活控制图片展示效果 2.2 具体实现示例 <div class="square"> <img src="your-image.jpg" alt="示例图片" /> </div> <style> .square { width: 50vw; padding-bottom: 50vw; /* 自适应正方形 */ position: relative; overflow: hidden; /* 防止图片溢出 */ } .square img { position: absolute; top: 50%; left: 50%; width: 100%; height: 100%; object-fit: contain; /* 保持比例且不拉伸 */ transform: translate(-50%, -50%); } </style> 2.3 说明 使用 padding-bottom 创建正方形容器 position: relative + position: absolute 定位图片,方便居中 图片宽高设为 100%,配合 object-fit: contain 保持原始比例且不被拉伸 overflow: hidden 防止图片超出容器边界显示 可根据需求改为 object-fit: cover 实现填充并裁剪效果 三、常见误区或面试陷阱 不设置 object-fit,直接用 width 和 height 100%,图片可能被拉伸变形 忽略容器定位,导致图片无法居中或布局错乱 未设置 overflow: hidden,图片溢出影响页面布局 误用 background-image 和 background-size,与 img 标签区别不清 4. 怎么理解回流跟重绘?什么场景下会触发? 题库原题:怎么理解回流跟重绘?什么场景下会触发? ...

July 28, 2025

阿里巴巴-社招-2年 · 第 1 轮 · 二面

← 第 1 轮 · 返回本次面经 · 已是最后一轮 → 本轮要点: call、apply和bind、性能优化、浏览器渲染过程、浏览器的缓存机制 本轮共 10 道题。答案默认折叠,便于先自行作答。 1. 假设现在有一个老项目需从React 17升级至React 18,你会怎么做 题目要点 先升级 react/react-dom 版本,再更改根渲染方式为 createRoot 理解 React 18 并发特性,调整相关组件代码 确认并升级第三方依赖,保证兼容性 充分测试,监控性能,平滑迁移 参考答案 一、考察点 理解 React 18 的新特性及其对应用的影响 掌握 React 18 升级步骤及兼容性处理 了解新版本的渲染机制变化(如并发特性) 熟悉常见问题排查与升级风险规避 二、参考答案 2.1 升级前准备 阅读官方升级指南(React 官方文档提供详尽升级说明) 检查项目依赖版本,确保 React 相关依赖(如 ReactDOM、react-scripts 等)兼容 React 18 备份代码及建立测试环境,保证升级过程可回滚 2.2 主要升级步骤 1)升级 React 和 ReactDOM 版本 npm install react@18 react-dom@18 或 yarn add react@18 react-dom@18 2)更新根节点渲染方式 React 18 引入了新的根 API:createRoot,替代 React 17 的 ReactDOM.render。 ...

July 28, 2025

阿里巴巴-社招-2年 · 第 1 轮 · 一面

← 已是第一轮 · 返回本次面经 · 第 1 轮 → 本轮要点: react hooks、WeakMap 和 WeakSet 本轮共 12 道题。答案默认折叠,便于先自行作答。 1. ES6相关属性都用过那些 题目要点 熟悉 ES6 关键新特性和语法糖 了解特性设计目的,提升代码可维护性和性能 结合项目场景合理运用,避免滥用带来的副作用 使用 ESLint 及 Babel 保证兼容性和规范 参考答案 一、考察点 全面了解 ES6(ECMAScript 2015)新特性 掌握模块化、变量声明、函数、对象、数组、字符串、类、Promise 等核心特性 能说明特性使用场景、优势及与旧版本对比 具备在项目中合理应用 ES6 特性的能力 二、参考答案 1.1 变量声明 let 和 const:块级作用域,解决 var 变量提升和重复声明问题 推荐使用 const 声明常量,let 声明可变变量,避免全局污染 1.2 模板字符串(Template Literals) 使用反引号 ` 支持多行字符串和内嵌表达式 ${expr} 替代传统字符串拼接,提升可读性 1.3 解构赋值(Destructuring) 支持数组和对象解构,简化变量赋值 常用于函数参数处理、数据提取 1.4 箭头函数(Arrow Functions) 简洁函数表达式,自动绑定 this 不可作为构造函数,不绑定 arguments 常用于回调和函数简写 1.5 扩展运算符(Spread)和剩余参数(Rest) 扩展运算符 ... 用于数组和对象展开 剩余参数用于函数参数收集 1.6 对象字面量增强 属性简写、方法简写、计算属性名 支持简洁声明和动态键名 1.7 类(Class) ES6 引入基于原型的语法糖,支持继承、构造函数、静态方法 提升面向对象编程体验 1.8 Promise 和异步编程 用于异步流程控制,解决回调地狱 支持链式调用和错误捕获 1.9 模块(Module) import 和 export 语法,支持静态分析和按需加载 替代传统的 CommonJS、AMD 模块规范 1.10 Symbol 类型 新增基本类型,表示独一无二的值 常用于定义对象的私有属性和常量 1.11 Set 和 Map 数据结构 Set:无重复元素集合 Map:键值对集合,键可以是任意类型 1.12 Iterator 和 Generator 统一遍历接口 Generator 生成器函数,用于异步流程和惰性计算 1.13 其他 for...of 循环:遍历可迭代对象 默认参数和函数参数尾逗号 数组新增方法如 Array.from、find、findIndex 三、常见使用场景及优势 特性 使用场景 优势与改进点 let/const 代替 var,块级作用域变量声明 避免变量提升和作用域污染 模板字符串 拼接复杂字符串和多行文本 可读性高,减少错误 解构赋值 参数提取、数组拆包、函数返回值拆分 代码简洁,语义清晰 箭头函数 回调函数、简化函数定义 自动绑定 this,代码更短 扩展运算符 数组合并、对象拷贝 简化代码,避免手动循环 Promise 异步请求、链式调用 解决回调地狱,增强异步流程可读性 模块化 项目拆分、代码复用 标准化模块,支持静态分析 Set/Map 需要高效查找、去重、键值映射的场景 性能优于传统对象和数组 四、常见误区或面试陷阱 ❌ 误区一:滥用箭头函数导致 this 绑定错误 不适合需要动态 this 的场景(如对象方法) ❌ 误区二:未充分利用解构赋值,写出冗长代码 理解解构赋值提升代码清晰度 ❌ 误区三:Promise 误用未捕获异常,导致异常丢失 应正确使用 .catch 或 try...catch 包裹 async/await 2. 为什么WeakMap的键必须是对象 题目要点 WeakMap 键必须是对象,因为弱引用机制只能作用于对象 对基本类型无法进行弱引用,无法参与垃圾回收机制 WeakMap 设计用于保存对象私有数据,避免内存泄漏 与普通 Map 区别在于弱引用和不可枚举特性 参考答案 一、考察点 理解 WeakMap 的设计初衷和底层实现机制 掌握 WeakMap 与普通 Map 的区别 了解 JavaScript 垃圾回收机制与弱引用的关系 能说明 WeakMap 键限制为对象的技术原因及应用场景 二、参考答案 1.1 WeakMap 的基本概念 WeakMap 是一种键为对象,值任意的数据结构 与普通 Map 不同,WeakMap 对键对象的引用是“弱引用” 当键对象不存在其它引用时,能被垃圾回收器回收,避免内存泄漏 1.2 键必须是对象的原因 1)弱引用必须指向对象 JavaScript 的弱引用机制只能对对象类型生效 基本类型(如字符串、数字)是值类型,无法被弱引用追踪和回收 2)垃圾回收机制要求 只有对象才存在垃圾回收标记和生命周期管理 WeakMap 通过弱引用允许键对象在无外部引用时自动回收 如果允许基本类型作为键,则无法做到弱引用,违背 WeakMap 设计初衷 3)设计意图和使用场景 用于存储与对象相关联的私有数据,避免内存泄漏 例如框架中保存某个 DOM 节点的元数据,DOM 节点销毁时对应数据自动释放 1.3 WeakMap 与 Map 的区别 特性 Map WeakMap 键类型 任意类型 只能是对象 是否可枚举 可遍历所有键值 不可遍历 引用强度 对键保持强引用,阻止垃圾回收 对键保持弱引用,不阻止垃圾回收 适用场景 普通键值映射 关联对象私有数据,自动回收 1.4 常见误区或面试陷阱 ❌ 误区一:认为 WeakMap 可以用基本类型作为键 会导致运行时错误,WeakMap 只能接受对象作为键 ❌ 误区二:误用 WeakMap 导致内存泄漏 忽略 WeakMap 不可遍历特性,误判数据存在与否 3. Map支持哪些非对象键 题目要点 Map 支持所有基本类型和对象作为键 包括字符串、数字、布尔值、Symbol、null、undefined 与 WeakMap 只能用对象键不同,Map 更灵活 理解键类型和对应的行为差异,避免键冲突 参考答案 一、考察点 理解 JavaScript Map 的键类型及其存储机制 掌握 Map 与 WeakMap 键的差异 了解基本类型和对象类型作为键的行为和区别 能说明非对象键在 Map 中的实际使用场景 二、参考答案 1.1 Map 键的类型支持 Map 的键可以是任意值,包括基本类型和对象类型 ...

July 28, 2025