京东、币安、字节跳动面试总结

7,252 阅读7分钟


京东

一面:

解释一下react的生命周期

为什么react要用虚拟dom,虚拟dom跟jquery直接操纵dom相比有什么优势吗

如何实现一个公用组件,聊到了提取共同业务逻辑,封装,并预留调用接口,比如可以预留callback function,也可以使用高阶组件的方式。

问:什么是高阶组件

在实现登录的时候为什么用cookie,为什么不用storage?

路由的权限管理是怎么实现的? 通过写一个privateRouter组件,判断用户是否登录,登录则返回相应页面组件,未登录则返回登录页面。

问:那你怎么判断用户有没有登录呢?登录的时候把用户登录信息放到了redux的state里面。

问:解释一下redux,redux是用来做什么的

解释一下this(回答了很多应用场景,但是缺乏归纳总结) 总结提炼

说一下copy的思路,循环递归

从一个一万个元素的数组里选从最大的前10个,如何实现

排序,js自带sort函数

问:sort排序的原理?sort函数是根据Unicode去排序的

如何不使用sort排序?答:快排,冒泡,堆排序等,说思路


二面:

了解哪些浏览器兼容的问题,怎样处理

处理过一些css方面的,但是不太多,现在一般的框架和UI组件库已经帮忙解决了兼容性的一些问题。css布局,每个人排版布局的习惯不一样,但是原则上讲尽量使用比较基础通用的属性和写法就可以解决掉大部分兼容问题了。

js兼容的话,事件绑定的方式IE和其它浏览器不一样,还有对新版html5接口/es6的支持不一样


你之前工作当中你觉得最复杂的业务场景是什么

(可以聊稍微复杂的场景或者性能相关的,可以答高并发,或者复杂交互,手工交易系统,低延迟)


怎样提升用户体验

交互体验的核心在于:减少用户思考

重要的功能不要隐藏太深,尽量保证三次点击以内可以找到用户想要的信息

UI设计角度,界面简洁直观,产品的视觉风格保持一致,配色之类的

表单需要用户填写的信息过多的情况,可以尝试把内容分到不同的页面,给出相应的进度提醒。 表单及时验证错误,最好在用户输入完某一项的时候给出相应的错误提醒


项目相关

之前有没有做过什么项目优化/项目的功能亮点

  • webpack热加载
  • webpack输出bundle文件的文件名加时间戳的hash码,解决浏览器缓存问题
  • 分页请求数据,不请求全量数据
  • 手工交易系统的股票搜索数据,是将3600多只股票的名称和代码字段数据全部缓存在本地,这样每次搜索的时候,不需要后端返回数据,搜索框做了事件节流和防抖的处理,防止输入过快导致占用渲染进程
  • 支持快捷键设置功能,创建一张本地字典(一大串json,存在localstorage里面),可以支持自定义快捷键,并帮用户绑定事件。比如设置f3和f4快捷键是买入卖出,本地就会存这两个按键对应的按键编码keyCode,{keyBuy: 114, keySell: 115},下次做股票交易的时候使用快捷键,就会监听相应的事件,触发对应的函数。
  • 股票搜索的下拉框是原生实现的一个tooltips

(比如合并请求文件数量、压缩,怎样把一些耗性能的组件改造之类的,最好有一些优化前后的对比指标,比如文件尺寸小了多少,传输速度快了多少,老组件原来能抗住多少级别的数据项,新组件又能抗住多少数据量)


平时怎样调试代码,有哪些调试方式

假如你的js代码里面有一个预先未定义的错误,要怎样catch到错误,保证代码在不同的浏览器能稳定运行?

try catch

(chrome和IE的控制台,fiddler、wireshark一些抓包工具,postman调试接口)


三面:

HEAD请求一般在什么情况下用

发布订阅模式

在发布-订阅模式下,发布者发布的消息不会直接推送给订阅者,而是通过消息中介。发布者和订阅者相互不知道对方的存在。当发布者发布一个消息的时候会通过中介把信息发送给相应的订阅者。

具体怎样原生实现?


JS的继承






币安

一面:

写一个compose函数,参数未知(arguments, promise)

写深拷贝

解释一下闭包,以及闭包获取外层函数定义的变量的原理

react hook以及fiber

fiber的三大排序策略

redux是用来做什么的,写一下redux处理数据的流程

有没有碰到过redux处理数据的一些性能问题

自己实现redux框架,说思路

发布订阅模式,单例模式

发布订阅模式,怎样监听事件,监听什么样的事件

实现权限管理(路由权限管理,页面权限管理,页面导航栏部分展示)

比如如果有个页面侧边导航栏需要向不同的人展示不同的选项,怎么实现?



二面:

自己实现一个modal及tooplie组件,要求写,没写出来

modal组件应该放到body里还是父的div?为什么?(弹框遮罩)tooplie组件如果放到body怎样对元素定位


怎样实现的文件上传

文件上传时的拖拽功能怎么实现

参考回答:

首先是三个事件,分别是mousedown,mousemove,mouseup

当鼠标点击按下的时候,需要一个tag标识此时已经按下,可以执行mousemove里面的具体方法。

clientX,clientY标识的是鼠标的坐标,分别标识横坐标和纵坐标,并且我们用offsetX和offsetY来表示元素的元素的初始坐标,移动的举例应该是:

鼠标移动时候的坐标-鼠标按下去时候的坐标。

也就是说定位信息为:

鼠标移动时候的坐标-鼠标按下去时候的坐标+元素初始情况下的offetLeft.

还有一点也是原理性的东西,也就是拖拽的同时是绝对定位,我们改变的是绝对定位条件下的left
以及top等等值。

补充:也可以通过html5的拖放(Drag 和 drop)来实现

文件上传的进度条怎样实现

文件上传怎样实现预览功能、需要监听哪些事件

之前做过的项目有什么亮点,或者比较有挑战性的事情



字节跳动

一面

写一个快排,先说思路

写promise.all

React Hooks

多种方式写垂直居中

fixed相对窗口定位在什么情况下会失效?


为什么Https要比Http安全

https相当于在http与tcp直接多加了一层SSL,用来加密

https会需要服务器购买ca证书,并且对证书做验证

能说一下Https加密的完整流程吗


二面

判断二叉树路径节点之和是否等于一个整数

sum(tree, n) 返回true or false

项目有做过什么优化吗

ssr

怎样解决兼容的问题

postCSS?

从输入URL到页面呈现发生了什么

js会不会阻塞渲染?怎么解决?

js异步请求会阻塞渲染吗?

微前端

微前端的核心价值在于 "技术栈无关",用来解决一些老旧项目的持续迭代问题。



跟谁学

算法题

1、给定一个字符串,找出其中不含有重复字符的最长子串

2、js十进制转二进制

React有哪些可以性能优化的点

React的Diff算法原理

虚拟DOM

Redux会有什么性能问题吗

在使用React的过程中踩过哪些坑

componentWillUnmount(){
// 卸载异步操作设置状态
this.setState = (state, callback) => {
return;
}
}

为什么会出现这样的问题?