被腾讯面试题“拷打”的那一晚,我怀疑人生…

194 阅读4分钟

被腾讯面试题“拷打”的那一晚,我怀疑人生…

面试结束,我的 CPU 冒烟了,堆栈溢出了,连浏览器都想关掉我。

最近参加了一场腾讯前端面试,面试官一句“我们聊聊原型链吧”,我就知道——今天,逃不掉了。

原型 & 原型链,我曾以为我懂了

“对象是如何继承属性的?”

我脱口而出:“通过原型链!”

然后紧接着就是一串灵魂拷问:

  • __proto__prototype 有什么区别?
  • 为什么 Object.create(null) 的对象访问不到 toString
  • 当访问一个对象的属性时,查找顺序是怎么走的?

我冷静地脑内模拟了一遍 JavaScript 引擎如何爬山涉水地穿越 [[Prototype]],一边讲一边感叹:这不就是 JavaScript 的“祖宗十八代”吗?


作用域链 & 执行时机:我以为我掌握了作用域,直到遇到了箭头函数

“说说 JavaScript 的作用域链。”

我从容开讲:“作用域链决定了变量查找的顺序,从当前作用域开始向上查找,直到全局作用域。”

接下来就是经典 combo:

“那为什么这个箭头函数里的 thisundefined?”

“因为……箭头函数没有自己的 this!继承的是外层上下文的 this!”

面试官点头,但我感觉自己快跟不上节奏了。我的大脑已经切换到了 Chrome 的 DevTools 模拟断点状态,眼看堆栈已经十几层深……


堆和栈、事件循环:你还记得你是如何学会异步的吗?

“讲讲堆和栈在 JS 中的区别。”

我忍着头疼答道:“栈用于存储基本类型和函数调用记录,堆用于对象等复杂数据的存储。”

紧接着,面试官一个补刀:

“那事件循环中,函数执行属于哪一块?又是何时进入执行栈的?”

我感觉我的内存管理已经“GC”失败了,但仍坚持补充:

  • JavaScript 是单线程的;
  • 执行栈中同步代码先执行;
  • 异步任务(如 setTimeout, Promise)由事件队列控制;
  • 微任务(Promise)比宏任务(setTimeout)优先级更高。

当我说出这些时,我仿佛看见面试官在浏览器控制台敲下了一行 console.log('你还行')


DOM、事件、加载时机:JavaScript 不懂 HTML 的心酸你不懂

“HTML 加载失败时,JS 脚本还能运行吗?”

我:“如果操作了尚未加载的 DOM,就会出错!所以得监听 DOMContentLoaded。”

“好,那 DOMContentLoadedwindow.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 基础文档,一边写笔记一边感叹:

“前端不只是写页面,它是操作浏览器的艺术。”

而这些面试题让我意识到:基础知识才是一个高级前端的真正壁垒。不论你写多少框架、多么炫酷的动画,最终都得回归语言本身。

腾讯的这场面试,虽然“拷打”我一顿,但也让我重新审视了自己的知识体系。感谢那位面试官,是你让我又进化了一次。


如果你喜欢这类技术深度与真实面经结合的文章,欢迎点赞、收藏、关注我~ 后续会继续分享前端一线大厂面经 + 技术精讲!