小米前端实习一二面
小米一面:
- 聊学习经历,聊一下项目(没深入,就是热个身吧)
- 上来就是三道代码题,这个没办法记不住,忘了copy下来了,涉及到的知识点:
- 闭包
- 作用域
- 宏任务、微任务
- 变量声明提升
- 事件循环
// 第一题 function sayHi() { console.log(name); // undefined console.log(age); // ReferenceError: Cannot access 'age' before initialization var name = 'Lyric'; let age = 19; } sayHi();
// 第二题,这个我傻了,第一个for循环明明是 3 3 3,我非要说 2 2 2,我是傻子,少加了一次 for (var i = 0; i < 3; i++) { setTimeout(() => { console.log(i); // 3 3 3 }, 1) } for (let i = 0; i < 3; i++) { setTimeout(() => { console.log(i); // 0 1 2 }, 1) // 第三题的一部分,还有一个 Promise 的题,太长了我忘了,复现不出来,反正很简单,事件循环会就可以 // 这个没答对,我以为是 [ 1, 2, 3 ],但是面试官让我下来再搜一搜资料 console.log(['1', '2', '3'].map(parseInt)); // [ 1, NaN, NaN ]
- 讲了讲有哪些宏任务和微任务,以及它们的循环方式,之后思考对于宏任务和微任务队列的实现方式(给了几个思路,1. 二维数组 2. 哈希散列 3. 数组链表)
- 垂直水平居中方式(4种 + 了解的两种,后面两种没说实现思路,只说了有这么个方式 grid 和table)要求手写,但是牛客网面试房间 HTML 标签也不能直接 tab 键补全,导致我写的很慢,面试官就说直接讲思路就好了
- Set、Map、WeakMap、WeakSet 区别(Map 和 Object 的效率问题,各自的 API,WeakMap 和 WeakSet 可迭代吗,JS 垃圾回收机制对 WeakMap 和 WeakSet 的影响)
- 本地存储了解哪些?Cookie、localStorage、sessionStorage 区别?(Cookie 详细介绍,包括 HTTP 无状态、domain、path、secure、httpOnly、SameSite)
- Vue 组件间通信方式(9种,1. props父传子 2. emit 子传父 3. bus公共事件总线 4. Vuex 5. parent/children 6. Storage 7. provide/inject 8. attrs 9. ref 和 refs)
- Vue 中 key 的作用,为什么有高效性?(就地复用、Diff 算法)
- Webpack相关,Proxy 代理跨域的实现原理(本地 -> 代理服务器 -> 跨域接口),并要求用 node.js 手写出来一个简单的例子【不会!(理直气壮)】
- 响应式布局,媒体查询 + 百分比布局 + rem,以及 rem 和 em 的区别(em 面试官说我搞错了,下去要学)
- 单行文本省略,多行文本省略分情况实现(按行数或高度两种情况,面试官提醒注意分情况!)
- 判断数组的方式(五种,1. typeof 2. constructor 3. instanceof 4. Object.prototype.toString.call 5. Array.isArray),然后说说 3. 4. 5. 方式的区别,顺便手写了 instanceof [ 省的讲一遍原型原型链了——从构造函数到寄生式继承 ]
- ES6 和 ES7 了解吗,我没先说 ES6,先讲了下 ES7 的 async 和 await,面试官就顺着这个开始问 setTimeout、Promise、async 和 await,然后实现原理 generator
- 反问环节:
问了问对于前端的发展方向,面试官说有元宇宙、lowcode 低代码平台等等,我听的云里雾里,但也是个方向了,毕竟我一窍不通 - 感受:小米面试官特别随和,会引导你把一个东西说出来,会给你足够的思考时间,感觉就像是在平等交流一样,而不是以面试者和面试官的位置去交谈,很容易就会放松下来。最后,面试官长得也特别帅!!!
小米二面:
- 防抖节流,原理介绍+应用场景,手写防抖和节流
- 介绍一下原型链,从构造函数到原型,再到原型链,盗用构造函数,原型式继承,寄生式继承,寄生式继承如何弥补了普通原型链的缺点。手写了原型式继承,以及手写寄生式继承如何连接父子构造函数。
- 做了一道事件循环代码顺序题目,关于Promise,setTimeout等,和平时见到的不太一样,有点绕,但是应该也不算难
- 问了 Vue 响应式原理,先手写了观察者模式(网上说是发布订阅模式,我觉得还是有区别的,发布订阅模式是 Vue 的 emit和 $on 的实现原理),之后讲 Vue 如何递归去把数据添加到响应式系统 【Object.defineProperty】,然后讲 Dep 和 Watcher 类,Vue 在 Compile 阶段如何识别 data 数据,实例化 Watcher 的过程【Dep.target】
- 问了问了不了解 computed 源码,不懂,面试官耐心的给我讲了讲
- HTTPS 和 HTTP 区别,就是讲公开密钥加密还有共享密钥加密,权威机构认证证书那些东西
- 浏览器缓存机制,强缓存、协商缓存等,还有个启发式缓存机制
- Vue 组件通信方式(9种)
- 本来面一个小时,最后大概面了30分钟,直接过了,可能是我讲的很细(至少对于实习生面试有点吧),面试官也说我基础特别扎实(心虚emoji),其实我很菜
- 反问环节:先是询问有没有三面,然后询问部门情况,最后是问了对于我发展的建议
总体来说,面试体验很好就这样...