最近找工作在复习些什么? 面试题题库
剑指前端offer
前端内参
前端内参是从简单到难涵盖了前端大部分的新概念和提醒以及部分算法题。讲得挺深入详细的。
暂时还没写AMD和CommonJS
三大框架那些省略了。
看完十大排序算法即可,后面有些内容写的不好,设计模式那章也可以读读看。
瓶子君博客
这两个题库都是我之前保存还没有完整背过的题库,大部分是八股文,涵盖范围也比较广
类比法(很有效) 你不会 Webpack 原理 → 类比 Vite → 类比 ESBuild → 引导到你会的 bundler 经验。 你不会红黑树 → 讲 JS Map 查找复杂度 + GC 优化。
这个知识点我记不全,但如果让我推断,我会从 XX 和 XX 逻辑入手
现实工程举例(面试官最爱听) 你不会 HTTP2 push → 讲 CSR/SSR/预渲染优化。 你不会微任务细节 → 讲调试 async/await 卡死的经验。
工程落地。
主动给改进建议 比如问你一个虚拟 DOM 的细节你忘了: “虽然我答不全,但基于现在的框架趋势我其实更推荐 signals / fine-grained reactivity,这能解决虚拟 DOM 的一些瓶颈。” 立刻显得你懂趋势、懂架构。
小结法(让你显得稳) “虽然我不能把这个知识点 100% 复述,但我能从原理、关联技术和工程实践三个角度保证我能把它用对。”
动态拆解。这个知识点我没有完全记住/我平时接触不多,但我可以基于原理尝试分析一下。
作业帮一面 vite和webpack Vite 采用 ES modules 原生支持,在开发环境下无需打包,直接在浏览器中加载模块,所以启动速度快。Webpack 需要打包所有代码后才能在开发服务器运行,虽然有优化但启动较慢。 在热更新方面,Vite 只需要重新编译改动的模块,速度很快。Webpack 的热更新虽然也很成熟,但涉及整个模块系统的处理。 生产环境下,两者都进行完整的打包和优化,性能差异不大。但 Vite 的配置相对简洁,Webpack 配置更复杂但灵活性更强。
content-type 这个通常出现在网络请求相关的题目中。Content-Type是HTTP 头,用来告诉服务器或浏览器发送的数据格式。常见的包括: application/json 用于 JSON 数据 application/x-www-form-urlencoded 用于表单数据 multipart/form-data 用于文件上传 text/html 用于 HTML 文档 text/plain 用于纯文本
数组扁平化 1 2 3 4 5 6 7 function flattern (arr, depth = 3 ){ if (depth > 0 ){ return arr.reduce ((acc, cur ) => acc.concat (flattern (cur, depth - 1 )), []) } else { return arr } }
执行顺序问题 答的不好。
某公司一面,怎么判断链表有环 用快慢指针,slow指针每次走一步,fast指针每次走两步。如果链表无环,fast一定会先走到null,说明没有环。如果链表有环,fast和slow指针会相遇。只有slow===fast,说明有环。时间复杂度O(n),空间复杂度O(1)。
某公司一面 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 function sameValue (a, b ) { if (Number .isNaN (a) && Number .isNaN (b)) return true ; if (a === 0 && b === 0 ) return 1 / a === 1 / b; if (a === b) return true ; if (a === null || b === null ) return false ; if (typeof a !== "object" || typeof b !== "object" ) return false ; const isArrA = Array .isArray (a); const isArrB = Array .isArray (b); if (isArrA !== isArrB) return false ; const keysA = Object .keys (a); const keysB = Object .keys (b); if (keysA.length !== keysB.length ) return false ; for (let key of keysA) { if (!sameValue (a[key], b[key])) { return false ; } } return true ; }
npm包按需加载 npm包按需加载依赖tree-shaking和代码分割。 只要npm包支持独立模块文件(如 lodash/debounce)或ESM格式(如 lodash-es),打包器就能自动删除未使用的代码。 也可以通过动态import实现运行时按需加载,而UI库通常通过 babel-plugin-import或自动按需工具实现组件级别加载。 本质是减少bundle体积和提升性能
web3公司一面,被问懵了。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 function main ( ) { console .log (1 ); setTimeout (() => { console .log (2 ); }, 1000 ); setTimeout (() => { console .log (3 ); Promise .resolve (4 ).then ((res ) => { console .log (res); }); }, 500 ); try { new Promise ((resolve, reject ) => { console .log (5 ); reject (6 ); console .log (7 ); resolve (8 ); }).then ((res ) => { console .log (res); }); } catch (error) { console .log ("error" , error); } console .log (9 ); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 const [count, setCount] = useState (0 ) useEffect (() => { const timer = setInterval (() => { console .log ("count" , count) }, 1000 ); return () => { clearInterval (timer) } }, []) const handleClick = ( ) => { setCount (count + 1 ) }const countRef = useRef (count)useEffect (() => { countRef.current = count }, [count]) useEffect (() => { const timer = setInterval (() => { console .log ("count" , countRef.current ) }, 1000 ); return () => { clearInterval (timer) } }, [])
之前没好好做面试总结,接下来要好好做面试总结。
apple一面
三数之和,没写出来,忘记了。一段时间不写,连两数之和都会忘记,哎。
自由职业者期间的项目日活。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 function threeSum (nums ){ const res = [] nums.sort ((a, b ) => a - b); for (let i=0 ; i<nums.length -2 ; i++){ if (i>0 && nums[i] === nums[i-1 ]) continue ; let left = i+1 ; let right = nums.length -1 ; while (left<right){ const sum=nums[i]+nums[left]+nums[right]; if (sum === 0 ){ res.push ([nums[i], nums[left], nums[right]]) while (left < right && nums[left] === nums[left+1 ]) left++ while (left < right && nums[right] === nums[right-1 ]) right-- left++ right-- } else if (sum<0 ){ left++ } ekse { right-- } } } return res; } function threeSum (nums ){ const res = []; const set = new Set (); for (let i=0 ; i<nums.length -2 ; i++){ for (let j=i+1 ; j<nums.length -1 ; j++){ for (let k=j+1 ; k<nums.length ; k++){ if (nums[i] + nums[j] + nums[k] === 0 ){ const arr = [nums[i], nums[j], nums[k]].sort ((a,b ) => a-b); const key = arr.join (',' ) if (!set.has (key)){ set.add (key); res.push (arr) } } } } } return res; }