字节AML前端日常一面
- 自我介绍
- 说项目
- 说一下js基本类型
- 说一下bind, call, apply的区别
- 说一下原型链
- 说一下new发生了什么,没说出来
function mynew(func, ...args) { const obj = {} obj.__proto__ = func.prototype let result = func.apply(obj, args) return result instanceof Object ? result : obj }
- 说一下async await怎么实现,我答的generator函数
- 说一下闭包,实现一个计数器
- 实现一个request,可以在失败的时候重试,有interval和maxCount参数
async function request(options, interval, maxCount) { let alreadyRetryCounts = 0 let result const fetchData = async () => { await fetch(options) .then(res => result = res) .catch(() => { alreadyRetryCounts++ if (alredayRetryCounts <= maxCount) { setTimeout(fetchData, interval) } }) } await fetchData() return result }
- 浏览器的事件循环和Nodejs的事件循环的区别
- 输出题,哪些是宏任务,微任务?
async function async1() { console.log('async1 start'); await async2(); console.log('async1 end'); } async function async2() { console.log('async2'); } 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');
出了点小问题,没做过await相关的,都是Promise.then,之类的同步写法
script start async1 start async2 // 正确的 promise1 script end async1 end promise2 setTimeout // 我把awiat 语句包括下面那行当成微任务处理了,所以我面试的时候说的是 script start async1 start promise1 script end async2 // 错误的 async1 end promise2 setTimeout
- 算法题,爬楼梯,斐波那契秒了
const fib = (n) => { const nums = [0, 1] if (n <= 1) return n for (let i = 2; i <= n; i++) { nums[i] = nums[i - 1] + nums[i - 2] } return nums[n] }
反问:
- 技术栈,假如要入职的话会做什么工作
- 对我有什么建议
面试官说我还不错,许愿二面