知乎社招前端面试(一面)
基础题
- 闭包;
- 回流和重绘?如何规避带来的性能开销?;
- cookie的samesite属性;
- 浏览器缓存策略;
- 强制缓存和协商缓存状态码区别;
- 箭头函数和普通函数区别;
- 状态码301和302区别
- React v15和v16的区别 生命周期函数;
- fiber理解;
- 兄弟组件间通信方式;
- context使用;
- 受控组件和非受控组件区别;
- webpack优化点;
- hapyPack组件共享进程设置;
- webpack增量更新设置;
笔试题
- 输出结果:
console.log(1); setTimeout(() => { console.log(2); }); new Promise((resolve) => { resolve(); console.log(3) }).then(() => { console.log(4); }).then(() => { console.log(5); }); console.log(6); // 1,3,4,5,6
- a为何值时下述表达式成立:
var a = ? if (a==1 && a==2 && a==3) { console.log(1) } // a = {i:1, valueOf: () => a.i++}
3.手写Promise.all
// 思路解析 // 1.Promise.all()返回的肯定是一个promise对象,所以可以直接写一个return new Promise((resolve, reject) => {})(这应该是一个惯性思维) // 2.遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象 // 3.关键点是何时"决议",也就是何时resolve出来,在这里做了计数器(count),每个内部promise对象决议后就将计数器加一,并判断加一后的大小是否与传入对象的数量相等,如果相等则调用resolve(),如果任何一个promise对象失败,则调用reject()方法。 // 一些细节: // 1.官方规定Promise.all()接受的参数是一个可遍历的参数,所以未必一定是一个数组,所以用Array.from()转化一下 // 2.使用for…of进行遍历,因为凡是可遍历的变量应该都是部署了iterator方法,所以用for…of遍历最安全 Promise.prototype.myAll = function(iterators) { // 可遍历参数转换为数组 const promises = Array.from(iterators); const len = promises.length; // 执行成功标识 let count = 0; let resultList = []; // 返回一个Promise对象 return new Promise((resolve, reject)=>{ promises.forEach((p,index) =>{ Promise.resolve(p) .then((result)=>{ count++; resultList[index] = result; if(count === len){ resolve(resultList); } }) .catch(e=>{ reject(e); }) }) }) }#面经##知乎##社招##前端工程师#