快手前端一面+二面-北京效率流程中心
3.17 上午11点一面
- 题目一:实现reduce函数
function myReduce(arr, total, cur) { }
- 题目二:看一段代码的输出,涉及到原型链、构造函数、new的this指向问题
function Foo() { Foo.a = function() { console.log(1) } this.a = function() { console.log(2) } } Foo.prototype.a = function() { console.log(3) } Foo.a = function() { console.log(4) } Foo.a(); //4 let obj = new Foo(); obj.a(); //2 Foo.a(); //1
- 题目三:看一段代码输出,涉及宏任务、微任务
setTimeout(_ => console.log(1)) new Promise(resolve => { resolve() console.log(2) }).then(_ => { setTimeout(_ => console.log(3)) console.log(4) Promise.resolve().then(_ => { console.log(5) }).then(_ => { Promise.resolve().then(_ => { console.log(6) }) }) }) console.log(7) 调用栈 2 7 宏任务队列 1 3 微任务队列 4 5 6
- 题目四:实现一个 sleep 函数,如 sleep(1000) 意味着等待 1000 毫秒
function sleep(time) { return new Promise((resolve, reject) => { setTimeout(()=>{ resolve() }, time) }) } sleep(1000).then()
3.22 上午11点二面
1.自我介绍以及为什么选择前端
2.字符串反转
function reverseString(str) { return str.split("").reverse().join(""); } console.log(reverseString("hello world"))
3.数组拍平
function my_flat(arr) { let ans = []; for(let item of arr) { if(Array.isArray(item)) { ans = ans.concat(my_flat(item)); //ans =[...ans, ...my_flat(item)]; }else { ans.push(item); } } return ans; } console.log(my_flat([1, [1, [1]]]))
4.拿取树对象属性
function fn(tree, name){ //To Do } var tree = { name : '中国', children : [ { name : '北京', children : [ { name : '朝阳群众' }, { name : '海淀区' }, { name : '昌平区' } ] }, { name : '浙江省', children : [ { name : '杭州市', code : '0571', }, { name : '嘉兴市' }, { name : '绍兴市' }, { name : '宁波市' } ] } ] }; var node = fn(tree, '杭州市'); console.log(node); // { name: '杭州市', code: 0571 }
//面试的时候写了一半被叫停了,下来自己接着先实现了一版能跑的 function fn(tree, name){ //bfs let Queue = [[tree.name,tree.children]]; while(Queue.length > 0) { //出队当前节点 let cur = Queue.shift(); if(cur[0] === name) return {name: name, code:cur[1]} //将children入队 if(cur.length === 1) continue; for(let node of cur[1]) { let obj = [node.name]; if(node.hasOwnProperty("children")) obj.push(node.children); if(node.hasOwnProperty("code")) obj.push(node.code); Queue.push(obj); } } return -1; }
5. 看一段代码输出
setTimeout(function() { console.log(1); //4 }, 0); new Promise(function (resolve, reject) { console.log(4); //1 resolve(2); //3 }).then(console.log); console.log(3); //2 //调用栈 4 3 //宏任务 1 //微任务 2
6.盒子模型 以及常用的
7.常用的展示文字的标签,行内元素标签
8.常用的布局
flex布局
grid布局
float布局
绝对定位 absolute、fixed
9.float布局的使用场景及存在的问题
图片文字环绕、可能会让父元素高度塌陷
10.绝对定位使用场景
11.页面自适应
12.网页滚动怎么实现的
对文字设置overflow-y会不会滚动
13.vue组件传值
父子组件:props、$emit、$children、$parent、ref
隔代:provide、inject、$attrs
兄弟: vuex、event-bus、localstroage、sessionStroge、cookie
14.什么情况下用到vuex
15.父子组件传值,父组件中更改了这个prop,子组件会执行什么样的生命周期,有遇到过这种场景嘛?
16.计算属性与侦听属性的使用场景,结合着自己的项目来展开说明
17.使用计算属性的好处
反问:
1.实习有转正嘛?
2.进去后实习生的培养
3.对于这次面试,我还有什么需要加强和补充的
对自己的项目的细节应该掌握更清楚些