前端面试算法题都比较简单,难度不超过 medium。
除了算法题以外,一般会问一些设计题/场景题。
通常都会在无 IDE 的环境下,直接写代码。
不能太过于依赖 IDE 的自动提示/补全,要有意识的记住一些常用包装类型的方法,以及需要养成良好的代码风格。
春招一面钉钉的时候面了以下两个问题,以及一个 165.比较版本号
//评测题目: 1-随机字符串生成
/*
实现一个随机符串生成函数 randomStr(),要求如下:
1. 生成的随机的字符串应该以字母开头,并包含 [a-z][0-9] 这些字符。
2. 生成的字符串长度为 8。
3. 生成的字符串不能够在程序运行的生命周期中存在重复的情形。
*/
const randomStr = (() => {
let used = new Set()
let result;
let map='abcdefghijklmnopqrstuvwxyz0123456789'
function Random() {
result = map[Math.floor(Math.random()*26)]
for (let i = 0; i < 7; i++) {
let random = map[Math.floor(Math.random() * 36)]
result += random
}
if (used.has(result)) {
return Random()
}
used.add(result)
return result
}
return Random
})()
//评测题目: 3-日志上报
/*
现在有一个基于 http 的前端日志采集系统,为了优化性能,我们需要把较密集的单次上报日志的行为,
改成合并掉 100ms 时间窗口内的单次上报为批量上报。
假设现有的单次上报的函数如下,请改写此函数的实现,不能使用任何库:
假设现有的单次上报的函数如下,请改写此函数的实现,不能使用任何库:
const uploadLog = (logStr) => {
fetch('https://log.xxx.com', {
method: 'POST',
body: JSON.stringify([logStr])
});
}
注意:
1.没有日志上报调用时,不发生 http 请求。
2.无论日志上报调用有多频繁,http 请求间隔"不小于" 100ms
*/
// uploadLog('123');uploadLog('456');
//考察闭包 + 节流
const uploadLog=(logStr)=>{
let timer=null;
let queue=[]
return()=>{
queue.push(logStr)
if (timer) {
return;
}
timer = setTimeout(() => {
console.log(queue);
queue=[]
timer = null;
}, 100);
}
}
setInterval(uploadLog([111]),10)