小米前端

982 阅读9分钟
概念性问题

JS

es6新特性

this指向,箭头函数和普通函数的区别

  1. 箭头函数是匿名函数,不能作为构造函数,不能使用new
  2. 箭头函数不能绑定arguments,取而代之用rest参数...解决
  3. 箭头函数没有原型属性
  4. 箭头函数的this永远指向其上下文的this,没有办改变其指向,
    普通函数的this指向调用它的对象

闭包

let var const 区别,变量提升,函数提升,为何存在变量提升,函数提升

promise generator async await 异同

promise.all用过吗?如何实现当其中一个promise抛出错误的时候也能顺利执行promise.all的回调?

Promise.all([a,b,c].map(p => p.catch(e => { console.log(e, 'e'); })))

.then(res => { console.log(res, 'res'); })

.catch(err => { consol.log(err, 'err'); });


{}+[] 和[]+{}的值一样吗?为什么

先说结论:不一样。 {}+[] == “[object Object]”   []+{} == 0

隐式类型转换

先说 [] + {} 。一个数组加一个对象。
加法会进行隐式类型转换,规则是调用其 valueOf() 或 toString() 以取得一个非对象的值(primitive value)。如果两个值中的任何一个是字符串,则进行字符串串接,否则进行数字加法。
[] 和 {} 的 valueOf() 都返回对象自身,所以都会调用 toString(),最后的结果是字符串串接。[].toString() 返回空字符串,({}).toString() 返回“[object Object]”。最后的结果就是“[object Object]”。

然后说 {} + [] 。看上去应该和上面一样。但是 {} 除了表示一个对象之外,也可以表示一个空的 block。在 [] + {} 中,[] 被解析为数组,因此后续的 + 被解析为加法运算符,而 {} 就解析为对象。但在 {} + [] 中,{} 被解析为空的 block,随后的 + 被解析为正号运算符。即实际上成了:
{ // empty block }
+[]
即对一个空数组执行正号运算,实际上就是把数组转型为数字。首先调用 [].valueOf() 。返回数组自身,不是primitive value,因此继续调用 [].toString() ,返回空字符串。空字符串转型为数字,返回0,即最后的结果。


let a=b=c=1,a b c的 值是什么,有什么区别

function test(){    

let a=b=c=0; 

}

let a=b=c=0 相当于 c=0; b=c; let a=b;

b和c为全局变量,a为局部变量


Eventloop


Object.keys()能不能取得原型链上的属性,for in跟Object.keys()有区别吗?

Object.keys()不能获取原型链上的属性,for in可以获取原型链上的属性。


事件模型的三个阶段说一下?

三个嵌套的div,每个div都同时绑定一个捕获事件和一个冒泡时间,写出事件执行顺序?

事件代理委托?父节点定义了多个点击事件,点击子节点,如何实现一个事件不执行,其他所有的事件都执行?用stopDefault()组织该事件默认行为。

如何阻止冒泡?


手写+代码算法

手写防抖 节流(定时器+时间戳)

手写instanceof

手写promise/promise.all

函数柯里化

手写深拷贝

快速排序/冒泡

打印一个树结构的对象???

  • 算法题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。(leetcode原题)
  • 算法题:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。(leetcode原题)


  • 前端工程化

    webpack打包流程/原理

    简述__webpack_require__方法

    es6 module和 commonjs规范的区别

    webpack的作用是什么?开发环境和测试环境之间的配置文件有什么区别?



    一面

    问问项目
    手写防抖 节流(定时器+时间戳)
    手写instanceof
    webpack原理
    职业规划
    对小米的看法
    其他的忘了

    二面

    new做了什么
    es6新特性
    变量提升
    this的指向
    手写封装promise超时
    手写深拷贝
    问问项目 其他忘了



    1.let var const 区别,变量提升,函数提升,为何存在
    2.箭头函数用法和区别(箭头函数跟普通函数的区别,this指向等,需要特别关注)
    3.new做了什么事,实现一个new
    4.实现deepCopy,(我使用reflect.ownkeys做的)
    7.快速排序
    8.promise generator async await 异同
    9.promise简单手写
    10.{}+[] 和[]+{}的值一样吗?为什么

    11 let a=b=c=1,a b c的 值是什么,有什么区别(这两道题不知道是不是小米的,有些遗忘)


    一面

    2. Eventloop
    3. 防抖
    6. 打印一个树结构的对象
    8. 对小米的看法

    二面
    1. 围绕项目问了一些问题
    2. 状态管理库redux和vuex的区别
    3. webpack打包流程
    4. 简述__webpack_require__方法
    5. es6 module和 commonjs规范的区别
    9. 深拷贝,遍历然后递归
    10. Object.keys()能不能取得原型链上的属性,for in跟Object.keys()有区别吗?

    Object.keys()不能获取原型链上的属性,for in可以获取原型链上的属性。

    11. 你的数据结构和算法知识掌握的怎么样,我在算法这一块比较薄弱,就如实回答了我熟悉数据结构并了解一些简单的算法,面试官人很好,也没有难为我,就让我讲了讲我知道的排序算法,并让我挑一种实现并解释

    (快排,冒泡,一定要能描述清楚原理,会写,堆排序)


  • 算法题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。(leetcode原题)
  • 算法题:给定一个字符串和一个字符串字典,找到字典里面最长的字符串,该字符串可以通过删除给定字符串的某些字符来得到。如果答案不止一个,返回长度最长且字典顺序最小的字符串。如果答案不存在,则返回空字符串。(leetcode原题)


  • 2.浏览器渲染过程以及浏览器是单线程还是多线程,为啥?
    计算机网络:1.http vs https,各自基于什么协议?关于http深究了个啥问题,我转瞬即逝的记忆....
    2.http2 vs http1, 关于http2我说多路复用让解释,感觉自己解释得好像看了假资料。问我http1没有长连接吗??
    3.浏览器缓存,问了expires缺点,只说了有时差问题,还有呢
    4.http的options请求(不能只知道get,post,呜)
    JS:1.函数柯里化
    2.变量提升
    3.闭包

    框架:1.都学了啥框架啊?Vue vs jQuery,为什么Vue更快?
    2.双向数据绑定原理我说的Object.defineProperty()巴拉巴拉,她问要是引用类型的这个不好使,比如数组怎么双向绑定?
    数据结构:1.数据结构学的怎么样啊?利用辅助栈进行栈排序,思路 三分钟思考....
    2.快排原理
    3.堆排序,用大根堆小根堆

    问的很基础,感觉还是答的缺乏逻辑和深刻,不会的问题面试官让直接说不会,几乎不等待。知识面面俱到可能遭不住,要鞭辟入里!


    1. 有自己在npm上发布过依赖包吗?
    2. webpack的作用是什么?开发环境和测试环境之间的配置文件有什么区别?
    3. devtool有那些选项,分别有什么作用?
    4. devServer的实现原理了解过吗?
    5. 说一下event loop的过程?
    6. reqeustAnimationFrame有用过没,是如何使用的?就是递归调用呗。她是属于微任务还是宏任务?
    7. promise定义时传入的函数什么时候执行的?
    8. promise.all用过吗?如何实现当其中一个promise抛出错误的时候也能顺利执行promise.all的回调?
    9. 时间模型的三个阶段说一下?三个嵌套的div,每个div都同时绑定一个捕获事件和一个冒泡时间,写出事件执行顺序?
    10. 事件代理委托?父节点定义了多个点击事件,点击子节点,如何实现一个事件不执行,其他所有的事件都执行?用stopDefault()组织该事件默认行为。
    11. 如何阻止冒泡?
    12. 浏览器的缓存机制?
    13. 前端工程化的理解?

    一面就这么结束了,大概一个小时吧,然后小哥哥让我等一会儿。

    二面

    1. 平时pc端做的多还是移动端做的多?
    2. 主要是通过什么手段实现响应式布局的?
    3. 做移动端适配的时候需要设置什么?
    4. 详细说一下viewport?
    5. 手写了一个react组件,组件里有A和B两个子组件,A组件属性接受了父组件的state属性,B组件没有接受state属性,当父组件setState之后,如何变化?
    6. 还是刚刚的组件,实现一个异步获取数据列表[‘a’, ‘b’, ‘c’…],然后将这个数组中的数据渲染到dom中去的功能,最终是一个dom列表(<li>)。在componentMounted钩子里异步操作然后setState就ok了。为什么用componentMounted?因为此时dom节点已经挂载完毕,可以安全的对dom进行访问。
    7. react展示组建和功能组件的区别?
    8. react定义事件?使用前需要bind。
    9. es6新特性说一下?let、var、const区别?es6如何实现块级作用域的?
    10. WeakMap用过吗?没。。。
    11. promise.all?如何实现一个链式异步请求,一个请求完成继续下一个请求?then链式执行呗。中间如果有一个promise出错怎么办?如何确保执行到最后?我答的还是try catch前行resolve,不过好像不太对,有知道的大神求指导。
    12. promise、async/await、generator区别?
    13. 手撕代码:找出一个字符串中重复次数最多的字母?
    14. 手撕代码:实现对象的深克隆?


    CSS相关

    文本居中,文本溢出

    垂直居中布局

    1.CSS选择器权重,包含选择器伪类选择器啥的都要说全;还有link,@import,<style>,行内样式的优先级,伪类和伪元素的区别

    2.position的四种值

    3. BFC如何触发,除了处理高度塌陷还有其他的应用吗

    margin塌陷

    如何处理float造成的高度塌陷(多种解决方案)

    4.css有哪些引入方式
    浏览器渲染时如何处理link的css文件
    float

    布局相关

    1.双飞翼布局,圣杯布局写法大概思路;用CSS画三角形;

    2.垂直水平居中的几种方法(这题我感觉很头疼,硬背,有小机灵有好的思路么)

    手写flex水平垂直居中
    手写flex三列布局中间自适应
    flex是由那些属性组成的简写


    HTML:1.语义化,几条都要说

    SEO优化