被腾讯面试题“拷打”的那一晚,我怀疑人生…
面试结束,我的 CPU 冒烟了,堆栈溢出了,连浏览器都想关掉我。
最近参加了一场腾讯前端面试,面试官一句“我们聊聊原型链吧”,我就知道——今天,逃不掉了。
原型 & 原型链,我曾以为我懂了
“对象是如何继承属性的?”
我脱口而出:“通过原型链!”
然后紧接着就是一串灵魂拷问:
__proto__和prototype有什么区别?- 为什么
Object.create(null)的对象访问不到toString? - 当访问一个对象的属性时,查找顺序是怎么走的?
我冷静地脑内模拟了一遍 JavaScript 引擎如何爬山涉水地穿越 [[Prototype]],一边讲一边感叹:这不就是 JavaScript 的“祖宗十八代”吗?
作用域链 & 执行时机:我以为我掌握了作用域,直到遇到了箭头函数
“说说 JavaScript 的作用域链。”
我从容开讲:“作用域链决定了变量查找的顺序,从当前作用域开始向上查找,直到全局作用域。”
接下来就是经典 combo:
“那为什么这个箭头函数里的
this是undefined?”
“因为……箭头函数没有自己的 this!继承的是外层上下文的 this!”
面试官点头,但我感觉自己快跟不上节奏了。我的大脑已经切换到了 Chrome 的 DevTools 模拟断点状态,眼看堆栈已经十几层深……
堆和栈、事件循环:你还记得你是如何学会异步的吗?
“讲讲堆和栈在 JS 中的区别。”
我忍着头疼答道:“栈用于存储基本类型和函数调用记录,堆用于对象等复杂数据的存储。”
紧接着,面试官一个补刀:
“那事件循环中,函数执行属于哪一块?又是何时进入执行栈的?”
我感觉我的内存管理已经“GC”失败了,但仍坚持补充:
- JavaScript 是单线程的;
- 执行栈中同步代码先执行;
- 异步任务(如
setTimeout,Promise)由事件队列控制; - 微任务(Promise)比宏任务(setTimeout)优先级更高。
当我说出这些时,我仿佛看见面试官在浏览器控制台敲下了一行 console.log('你还行')。
DOM、事件、加载时机:JavaScript 不懂 HTML 的心酸你不懂
“HTML 加载失败时,JS 脚本还能运行吗?”
我:“如果操作了尚未加载的 DOM,就会出错!所以得监听 DOMContentLoaded。”
“好,那 DOMContentLoaded 和 window.onload 有什么区别?”
我:“一个是在 DOM 结构加载完成就触发,另一个要等图片、CSS 全部加载完。”
“那 script 标签该放哪?”
“推荐放在 </body> 前,或者用 defer,不阻塞 HTML 解析!”
我感受到浏览器中的 DOM 树在我脑中一点点“grow up”。
z-index、事件代理、线程与进程:每一道题都是灵魂拷问
面试官:“说说 z-index 不生效的原因?”
我脱口而出:“不是定位元素就不会产生堆叠上下文,z-index 不起作用。”
“再说说事件代理在哪个阶段执行?”
“冒泡阶段!”
“怎么避免某个子元素触发代理?”
“用 event.target 判断,然后 return 掉!”
js
CopyEdit
document.querySelector('.parent').addEventListener('click', function(event) {
if (event.target.classList.contains('exclude')) return;
// 执行其他逻辑
});
那一刻我明白了:面试官不是在问你会不会写代码,而是问你会不会思考代码背后的机制。
最后的暴击:进程、线程、存储、哈希、算法复杂度
“浏览器是如何管理进程和线程的?”
我忍住脱口而出的“这不是前端不关心的吗?”,开始认真回忆:
- 浏览器本身一个主进程;
- 每个标签页单独进程(Chrome 多进程架构);
- 主线程负责页面渲染和 JS 执行;
- Web Worker 可开启独立线程运行 JS;
- 还有网络线程、定时器线程等等。
面试官补一刀:“那本地存储有哪些?”
我已经开启背诵模式:
localStorage:持久保存,页面关闭不清除;sessionStorage:临时保存,会话结束清除;cookie:每次请求自动携带,大小限制;IndexedDB:结构化大数据存储,支持事务和索引。
“再讲讲哈希算法?”
“MD5、SHA-1、SHA-256……输入微小变化,输出巨大不同,用于校验、防篡改。”
“算法复杂度?”
“时间复杂度决定运行时间,空间复杂度决定内存占用。O(1)、O(n)、O(n²)、O(log n) 都是常见的。”
总结:这场面试让我“满 CPU 运转”
面试那晚,我回去连夜复盘,翻出了所有 JS 基础文档,一边写笔记一边感叹:
“前端不只是写页面,它是操作浏览器的艺术。”
而这些面试题让我意识到:基础知识才是一个高级前端的真正壁垒。不论你写多少框架、多么炫酷的动画,最终都得回归语言本身。
腾讯的这场面试,虽然“拷打”我一顿,但也让我重新审视了自己的知识体系。感谢那位面试官,是你让我又进化了一次。
如果你喜欢这类技术深度与真实面经结合的文章,欢迎点赞、收藏、关注我~ 后续会继续分享前端一线大厂面经 + 技术精讲!