2020-06-27 04:22:20
字节前端二面问题解答如下:
1. JS中一个函数返回另一个函数,是否叫高阶函数?接收一个或多个函数作为参数;
返回一个函数作为结果。例如:
function outer() { return function inner() { console.log('高阶函数示例'); };}manifest.json:配置文件,定义插件元数据、权限、入口脚本等;
background.js:后台脚本,处理全局逻辑;
content.js:注入页面的脚本,可操作DOM;
popup.html/js:插件弹窗界面及逻辑。
可通过chrome.webRequestAPI拦截请求,但需在manifest.json中声明webRequest和webRequestBlocking权限;
限制:仅能修改HTTP头或阻止请求,无法直接修改请求体(需结合content.js覆盖原生XMLHttpRequest或fetch)。
维护一个缓存池(如Map或对象),存储已挂起的组件实例;
通过唯一标识(如name)匹配组件,复用时直接从缓存中获取。
通常用WeakMap(避免内存泄漏)或普通Map存储组件实例;
示例:
const cache = new WeakMap();function keepAlive(vnode) { const key = vnode.key; if (!cache.has(key)) cache.set(key, vnode.componentInstance);}需合理设置缓存大小,避免内存占用过高;
及时清理无效缓存(如组件卸载时)。
常规递归深拷贝可能因循环引用导致栈溢出;
用WeakMap记录已拷贝对象,遇到循环引用时直接返回缓存结果,避免重复拷贝。
function deepClone(obj, map = new WeakMap()) { if (map.has(obj)) return map.get(obj); if (typeof obj !== 'object' || obj === null) return obj; const clone = Array.isArray(obj) ? [] : {}; map.set(obj, clone); for (const key in obj) clone[key] = deepClone(obj[key], map); return clone;}客户端在请求头中添加Connection: keep-alive;
服务器响应后不立即关闭连接,而是保持一段时间(可配置);
后续请求复用同一连接,直到超时或主动关闭。
同一客户端与服务器间的多个请求可复用;
不同域名或端口的连接需重新建立。
使用标志位控制后续操作(如.then()中检查标志);
结合AbortController(需配合fetch等支持取消的API)。
const controller = new AbortController();fetch(url, { signal: controller.signal }) .then(response => response.json()) .catch(err => { if (err.name === 'AbortError') console.log('请求已取消'); });controller.abort(); // 中断请求优先使用联合类型、类型守卫或泛型;
示例:用unknown替代any,再通过类型断言或类型保护处理。
unknown更安全,需显式类型检查后才能操作;
不可直接互换,需通过断言(如as)转换。