小米面试
小米面试¶
统计信息:字数 6212 阅读13分钟
笔试¶
1、爬虫引擎是怎样抓取页面的¶
2、浏览器渲染页面的过程¶
- 用户输入 URL 地址
- 浏览器解析 URL 解析出主机名
- 浏览器将主机名转换成服务器 ip 地址(浏览器先查找本地 DNS 缓存列表 没有的话 再向浏览器默认的 DNS 服务器发送查询请求 同时缓存)
- 浏览器将端口号从 URL 中解析出来
- 浏览器建立一条与目标 Web 服务器的 TCP 连接(三次握手)
- 浏览器向服务器发送一条 HTTP 请求报文
- 服务器向浏览器返回一条 HTTP 响应报文
- 关闭连接 浏览器解析文档
网上找的标准答案,自己答得也是这么个意思,但是没这详细。
3、异步编程的四种方法¶
看到这题瞬间感觉阮老师简直就是中国前端界的教父级人物啊,面试官的理想答案应该是阮老师这篇文章:Javascript 异步编程的 4 种方法。自己特地看过,也总结在我的面试题总结里面了:前端面试偏门题总结(https://www.bougieblog.cn/article/Qk9VMTlHSUU.html)。但是记性太差还是答偏了,心里恨啊。
4、解释同步异步、阻塞非阻塞、并行并发之间的区别¶
这里补充一下并行和并发:并行是指运算中的两件或更多件事情在同一时刻发生。实事求是地说,这种情况只会在系统 CPU 拥有两个独立核心时发生,这样在任何时刻才会有不同的电脉冲信号发出。并发意味着至少两件事务在同一时间段发生。但注意,这里的事务是(高级的)任务,而不是(低级的)操作。所以,请分清并发和并行。
5、js 实现数值千分位¶
头条笔试碰到过了: number.toLocaleString()
6、多语言网站建设应注意哪些事项?¶
一开始以为多语言是 python
、 java
、 php
啥的,后面面试官说是各个国家语言。
7、React 非父子、兄弟组件传值¶
状态管理:Redux、Mobx 等等。
8、"123456789876543212345678987654321..." 的第 n 位是什么?¶
function getNum(n) {
let num = 0,
flag = true
for (let i = 0; i < n; i++) {
if (num === 1) flag = true
if (num === 9) flag = false flag ? num++ : num--
}
return num
}
面试¶
1、浏览器打开一个页面前端缓存了哪些东西?¶
我:后端通过设置响应头 CacheControl
设置资源过期时间,用于缓存一些静态资源
面试官:还有呢
我:DNS 缓存
面试官:后端缓存了什么
我:缓存了 session
面试官:还有呢
我:... 答不上来了
2、说一下 vue 的生命周期¶
一年的 Vue 不是白用的,顺利从 beforeCreate
到 destroyed
过了一遍。
3、你的博客用的是 Koa,Express 用过吗?¶
我:用过,我的个人博客本来用的是 Express,后面改成 Koa 了
面试官:为什么要改?Express 不好用吗?
我:Koa 的路由用 async 和 await 处理,不会陷入回调地狱
面试官:Express 的路由也可以封装成 asyncawait,自己试过没有?
我:没有。。。
4、你的博客用的什么服务器?¶
我:用的 Node 服务器,pm2 做进程守护的
面试官:代码直接放上去运行的还是编译后运行的
我:(一脸懵比,脚本语言还能编译???)直接运行的
面试官:服务器是什么系统的?
我:windows sever...(感觉面试官笑了)
后来查了一下,segmentFault 的大佬们也说 Node JS 不用编译:运行在服务端的 Node.js 代码需要编译吗?(https://segmentfault.com/q/1010000009607720/a-1020000009607917),好想追问一下面试官到底怎么编译啊。
5、有没有自己实现过 Promise?¶
看了不少文章,自己也写过了,但问到细节还是答烂了。
6、有没有写过 Webpack 插件?¶
我:没有...
7、new 一个对象后发生了什么?¶
8、写过响应式网站吗?¶
我的个人博客就是响应式的,主要说了媒体查询和 rem 控制字体大小。
9、说一下原型和原型链¶
10、有没有自己写过比较复杂的正则?¶
11、有没有封装过 axios?¶
12、前后分离的系统,一个请求出错了,如何中断其它请求?¶
13、如何在 axios 中添加登陆验证?¶
14、rollup 了解过没?¶
15、为什么 rollup 打包赘余代码比较少?¶
16、有没有结合原生封装过 RN 组件?¶
17、为什么用高德地图不用百度地图?¶
18、怎样在 Android Studio 中对 React Native 的 js 代码进行断点调试?¶
补充一个 Tips,面试时看到武汉小米开发人员操作系统清一色的是 Ubuntu,想去面试的同学最好准备一下。
小米-小米应用商店(过)¶
一面¶
小米的面试官给人的感觉很亲切很真诚,是一个体验很不错的面试。
- css实现图片自适应宽高
- 讲flex,手写出flex常用的属性,并且讲出作用
- BFC是什么
- 项目里面的前端鉴权是怎么实现的?
- vue里面的虚拟dom是怎么回事?
- vue双向绑定讲一讲
- 手写函数防抖和函数节流
- 讲讲常用的es6语法,比如let、promise、class等等
- 浏览器渲染过程,回流重绘等等,load、DOMContentLoaded等等事件的触发顺序
- 从小米应用商店里面随便找了一个需求让我现场实现,写伪代码
二面¶
- 讲项目里面的鉴权和图片懒加载怎么实现的
- 讲vue-lazyloader的原理,手写伪代码
- 讲express框架的设计思想
- 线上日志是如何处理的
- 讲事件循环
- 讲nodejs的eventEmitter的实现
三面¶
- 讲项目里面做的事情
- 讲vue的响应式原理、依赖收集、监听数组、虚拟dom等等
- 讲express的中间件系统是如何设计的
- 现场从小米应用商店中找出一个需求现场实现,说思路,写关键的代码
四面¶
- 讲vue-lazyloader源码以及设计
- 使用es5实现es6的class
- websocket握手过程
- 浏览器的事件循环和nodejs事件循环的区别