面试题:前端
前端工程师岗位相关的基础、框架、浏览器、性能和工程化面试准备。
如何实现数组扁平化?
数组扁平化就是把嵌套数组按指定深度展开成一维或更浅层数组。实现时要处理递归深度、非数组元素保留、空位行为和大数组递归栈风险,不能只写一个最短递归版本。
如何实现数组去重?
数组去重的核心是定义“重复”的判断规则。基础类型可以用 Set 快速去重;对象数组需要指定唯一键或自定义比较逻辑,不能简单依赖引用是否相同。
如何手写 Array.prototype.map?
map 会遍历数组,把每个被访问元素交给 callback 处理,并把返回值按原索引放进新数组。它不修改原数组,回调会收到 value、index 和原数组三个参数。
如何手写 Array.prototype.filter?
filter 会遍历数组,把 callback 返回真值的元素按原顺序放进新数组。它不修改原数组,回调同样接收 value、index 和原数组,并支持 thisArg。
如何手写 Array.prototype.reduce?
reduce 会把数组元素从左到右累积成一个结果。实现重点是初始值规则:传了 initialValue 就从索引 0 开始;没传则用第一个存在的元素作为初始 accumulator。
如何实现 sleep 函数?
sleep 函数的作用是返回一个会在指定时间后完成的 Promise,让 async 函数可以用 await 暂停后续逻辑。它不会阻塞主线程,只是把后续代码放到异步流程里继续执行。
如何实现一个 once 函数?
once 函数会把一个函数包装成最多只执行一次的新函数。第一次调用时执行原函数并缓存结果,后续调用直接返回缓存结果,不再重复触发副作用。
如何实现前端路由的 hash 模式?
hash 路由利用 URL 中 # 后面的片段保存前端路径。浏览器 hash 变化不会向服务器请求新页面,前端可以监听 hashchange,根据当前 location.hash 匹配组件并渲染。
如何手写 new?
手写 new 要做四件事:创建一个新对象,把新对象的原型指向构造函数的 prototype,用这个对象作为 this 执行构造函数,最后根据构造函数返回值决定返回对象还是新对象。
如何手写 instanceof?
手写 instanceof 的核心是沿着对象的原型链向上查找,看能否找到构造函数的 prototype。左侧如果不是对象或函数,结果为 false;右侧需要提供可用于匹配的 prototype。