腾讯五面总结(offer)
人生中的第一次面试就奉献给了腾讯,真是紧张到不行,好在腾讯的三位面试官都十分nice。
面试内容无论是在深度还是广度上都大大超过了我的预期,感觉学习的道路任重而道远。。。
一面:
promise的底层实现原理
参考这篇文章,可以实现一个简易的promise。
发现promise可以有三种状态,分别是pedding 、Fulfilled、 Rejected。
- Pending Promise对象实例创建时候的初始状态
- Fulfilled 可以理解为成功的状态
- Rejected可以理解为失败的状态
es6 import export 和 require的区别
参考这篇文章,在CommonJS规范中,使用require来引用模块,但是require是同步的,对于浏览器,这是一个大问题,因为模块都放在服务器端,等待时间取决于网速的快慢,可能要等很长时间,浏览器处于”假死”状态。因此,浏览器端的模块,不能采用”同步加载”(synchronous),只能采用”异步加载”(asynchronous)。AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。它采用异步方式加载模块,模块的加载不影响它后面语句的运行。
JavaScript执行中的堆和栈(内存管理)
参考这篇文章:
heap是没有结构的,数据可以任意存放。heap用于复杂数据类型(引用类型)分配空间,例如数组对象、object对象。
stack是有结构的,每个区块按照一定次序存放(后进先出),stack中主要存放一些基本类型的变量和对象的引用,存在栈中的数据大小与生存期必须是确定的。
二面:
二面的面试官口音很重,表示欲哭无泪。。。
智力题:烤牛排,一面十分钟,同时只能烤两面,有三只牛排,最少需要多少时间?
不知道是因为太紧张了还是怎么的,一直潜意识的认为烤牛排要一次性烤好两面,其实可以先烤两只牛排的一面,随后取出一只牛排,另一只牛排翻面,放上第三只没烤的牛排,这样只要30分钟就能烤好啦。
在图片cdn那里,面试官让我考虑带宽和延迟哪一个对访问体验影响大?
我觉得这是一个开放性的问题,在中国目前的大环境下,网络质量已经很好了,只要前端做好图片的压缩处理,带宽应该不会成为瓶颈,此时,延迟就显得更重要了,我使用腾讯云1c1g1m的学生机,在并发量不大的情况下,浏览体验也很不错。但是之前租用vutlr的vps,虽然带宽有1000M,但是由于服务器在日本,TCP三次握手造成的延迟使得浏览体验非常差。
leader面:
网页动画除了使用css的@keyframs实现,还有那些实现方式?
- 直接扔Gif图,最无脑的做法,不够优雅,而且会拖慢加载速度
- css的transition,也是css实现动画,但是transition只有两态,不能像@keyframs一样自定义中间的状态。
https://github.com/daneden/animate.css 一个css库,实现了各种css动画 - 使用JavaScript控制元素位置实现动画。缺点是需要计算元素位置,代码量很大,不过这里有相关的动画库可以使用:https://github.com/bendc/animateplus
- 使用HTML5的canvas制作动画,包括可以使用three.js实现三维动画
智力题:班级中,有60%喜欢足球,70%喜欢篮球,80%喜欢排球,问既喜欢足球,又喜欢篮球的人有多少?
不考虑排球,结果应该是一个范围:
最多的情况:喜欢足球的人都喜欢篮球,此时既喜欢足球,又喜欢篮球的人为60%
最少的情况:0.6+0.7-1=0.3,此时既喜欢足球,又喜欢篮球的人为30%
结果为0.3-0.6
React的diff算法
可以查看这篇文章
TCP连接中,第三次握手丢包的情况下,client会继续保持链接吗?
服务器收到SYN包后发出SYN+ACK数据包,服务器进入SYN_RECV状态。
而这个时候客户端发送ACK给服务器失败了,服务器没办法进入ESTABLISH状态,这个时候肯定不能传输数据的,不论客户端主动发送数据与否,服务器都会有定时器发送第二步SYN+ACK数据包,如果客户端再次发送ACK成功,建立连接。
如果一直不成功,服务器肯定会有超时(大概64s)设置,超时之后会给客户端发RTS报文,进入CLOSED状态,防止SYN洪泛攻击,这个时候客户端应该也会关闭连接。
前端优化方法
301重定向和302重定向的区别
302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。
怎样在client端设置cookie
参考这篇文章
手撸代码
在大文本中查找重复次数最多的较长子字符串(至少2个字符).
<code class="javascript">var exmaple1 = 'abcedabcsdfsdfsabcssdfaabc'; //abc 3次
var exmaple2 = 'abcesdabcsdfsdfsabcsdsda' //sd 5次
function getLongestSubString(str) {
var result = {};
//字符串长度小于等于一,直接返回结果
if (str.length <= 1) {
console.log(str, str.length);
return;
}
//暴力二次循环字符串,并以字串:次数的kv形式存入obj中
for (let i = 0; i < str.length; i++) {
for (let j = i; j < str.length; j++) {
var temp = str.substring(i, j);
//满足以下条件才存入obj中,
if (temp !== '' && result[temp] === undefined && temp.length >= 2) {
var times = str.split(temp).length - 1;
result[temp] = times;
}
}
}
//num储存所有子串的出现次数
var num = [];
for (let i in result) {
num.push(result[i]);
}
//排序,取出最大出现次数
num.sort((a, b) => {
if (a < b) {
return 1;
} else {
return -1;
}
});
//num2储存最多出现的字符串,注意可能有多个
var num2 = []
for (let i in result) {
if (result[i] === num[0]) {
num2.push(i);
}
}
//对num2排序,取出出现次数最多,并且最长的子串
num2.sort((a, b) => {
if (a.length > b.length) {
return -1
} else {
return 1
}
})
//输出
console.log(num2[0], num[0]);
}
getLongestSubString(exmaple1);
getLongestSubString(exmaple2);
时间复杂度O(n2)
四面 总监面:
主要问了twitter的雪花算法、数据库设计,react native和原生开发的区别。顺带被我扯到flutter上面去了….
五面 HR面:
聊人生、聊理想、聊鹅厂福利
更新状态,今天收到offer call了