1面:
时长:60min (主要是自己比较拉跨,一个算法题卡了很久)
ps:面试官很好 很有耐心 遇到不会的会提示 遇到不足的地方会有建议
上来是五道手写代码题:
1.用CSS实现一个开关样式,hover时触发,滑块为正方形,具体大小可随意,如下图:
开关动作均有动画过度(滑块移位、背景色);
只用一个dom元素实现;
开关的高度是固定的,但宽度不固定,即宽度为未知父元素的100%,宽度始终大于高度;
2.输出打印结果
var result = [];
var a = 3;
var total = 0;
function foo(a) {
var i = 0;
for (; i < 3; i++) {
result[i] = function() {
total += i * a;
console.log(total);
}
}
}
foo(1);
result[0](); //3
result[1](); //6
result[2](); //9
追问为什么。 当时的i跟a分别是什么。 如果想要将i分别为0,1,2该怎么处理?
解决方案一:let声明i(追问还有其他什么方法吗)
解决方案二:使用立即执行函数包裹要处理的操作,并且将当前i传入。
3.求一个二叉树所有路径值之和
题目具体要求是同一个路径上的值为所有值的拼接值 如一条路径为 1->2->3 那么当条路径的值为123。最后求的是所有路径值之和。
一开始题目没看清楚 以为是求树的所有节点值之和。 写完面试官让我看看题目,我才发现是路径求和,但是刷的算法题不多,对递归用法还比较浅薄,没写出来。(厚着脸皮询问面试官能不能给点提示)结果面试官真给了。写出来后又发现是拼接值,又花了些时间做处理,最后终于写出来了。
ps:这里我身为面试者都不由感慨这位面试官耐心实在是太好了,卡了不知道有没有20分钟。
4.看代码写输出
async function async1() {
console.log('async1 start');
await async2();
console.log('async1 end');
}
async function async2() {
console.log('async2 start');
return new Promise((resolve, reject) => {
resolve();
console.log('async2 promise');
})
}
console.log('script start');
setTimeout(function() {
console.log('setTimeout');
}, 0);
async1();
new Promise(function(resolve) {
console.log('promise1');
resolve();
}).then(function() {
console.log('promise2');
}
console.log('script end');
第一次顺序写对了,面试官问为什么(所有面试都是会追问为什么的,不会真的蒙混不过去);然后面试官改题了。将async1(); 改成 await async1();
一开始脑子没转过来说顺序没改变,然后面试官非常和蔼地说你要不再想想。然后我想了会没想通,就把我的思路说了一下,然后面试官引导了一下就做出来了。
ps:这里还有个知识点是微任务队列中微任务执行时碰到微任务会放在本轮的微任务队列中继续执行。(当时说反了一个顺序,面试官问我为什么,我发现不对劲,因为我之前做过好像是微任务遇到微任务会继续执行,但是不知道原理,我说了正确答案,表示原理不太知道,面试官很和蔼告诉了原理)
5.实现一个节流函数
这个我没写,面试官说时间不够了。然后我就快速说了下防抖跟节流的原理。
口述面试题
1. 说一下隐式转换规则
说出abc == abcd会怎么转换
我说我不会但是猜想是通过转换成ASCII值来比较 查了资料发现貌似是蒙对了
简单说一下隐式转换规则
- 对象和布尔值比较 对象先转换为字符串,然后再转换为数字,布尔值直接转换为数字
- 对象和字符串比较 对象转换为字符串,然后两者进行比较。
- 对象和数字比较 对象先转换为字符串,然后转换为数字,再和数字进行比较。
- 字符串和数字比较 字符串转换成数字,二者再比较。
- 字符串和布尔值比较 二者全部转换成数值再比较。
- 布尔值和数字比较 布尔转换为数字,二者比较。
- 复杂数据类型的转换规则: xx.valueOf().toString()
2. 内存泄露是什么 怎么看内存有无泄露。知道浏览器中F12里的performance作用是什么吗?
只说了写什么会引起内存泄漏,其他的不会。面试官耐心说讲解了一下。
好像还有两个问题 忘了是啥了。
2面:
自我介绍,追问项目难点
说说mvc mvvm区别。
手撕代码:
1.MVC实现将li添加到ul里,并且点击li会改变li里的值
提示了之后算是做出来了
2.实现jsonp跨域,且超时返回错误。 我很顺畅的写出来了。
3.算法 0的移动, 顺畅写出来了。
然后说面试结束,请求面试官评价 说不评价,广度需要加多,问有什么自己比较好的 没考到的。说了vue react框架,http一些知识,redux,vuex。 但是面试官都没问,后来就说一个星期等消息。