javascript超级经典面试题(面试必过)

javascript超级经典面试题(面试必过)
最新回答
对天空说爱你

2026-04-07 13:05:11

以下是针对每个问题的详细解答:

一、记忆化斐波那契函数

答案:

const fibonacci = ((memo = [0, 1]) => { const fib = (n) => { let result = memo[n] if (typeof result !== "number") { result = fib(n - 1) + fib(n - 2) memo[n] = result } return result } return fib})()

解析:

  • 记忆化技术:通过闭包保存已计算结果,避免重复计算。
  • 递归优化:直接返回已存储结果,提升性能。
二、解析字串

答案:

const extractStr = (str) => { const ret = str.match(/:([^:.])*?./g) || [] return ret.map((subStr) => subStr.replace(/[:.]/g, '')) }

解析:

  • 正则匹配::([^:.])*?. 匹配 : 到 . 之间的内容。
  • 结果处理:移除首尾的 : 和 .。
三、safeGet

答案:

const safeGet = (o, path) => { try { return path.split('.').reduce((o, k) => o[k], o) } catch (e) { return void 666 }}

解析:

  • 路径解析:将路径拆分为数组,逐级访问。
  • 异常处理:捕获错误并返回 undefined。
四、判断两个矩形是否重叠

答案:

const isOverlap = (rect1, rect2) => { const l1 = { x: rect1.x, y: rect1.y } const r1 = { x: rect1.x + rect1.width, y: rect1.y + rect1.height } const l2 = { x: rect2.x, y: rect2.y } const r2 = { x: rect2.x + rect2.width, y: rect2.y + rect2.height } if ( l1.x > r2.x || l2.x > r1.x || l1.y > r2.y || l2.y > r1.y ) return false return true}

解析:

  • 坐标计算:确定矩形左上和右下坐标。
  • 重叠条件:检查是否存在不重叠的情况。
五、spacify

答案:

String.prototype.spacify = function () { return this.split('').join(' ')}

解析:

  • 字符串操作:拆分为字符数组后用空格连接。
六、按下标插入

答案:

const injectSections = (items, sections) => { const sectionsMap = new Map(sections.map(({ index, content }) => [index, content])) return items.reduce((ret, item, index) => { if (sectionsMap.has(index)) ret.push(sectionsMap.get(index)) ret.push(item) return ret }, [])}

解析:

  • 映射存储:使用 Map 存储插入内容。
  • 数组构建:遍历原数组并插入指定内容。
七、数组拍平(二)

答案:

function *flatten2(arr) { for (let i = 0; i < arr.length; i++) { const item = arr[i] Array.isArray(item) ? yield* flatten2(item) : yield item; }}

解析:

  • 生成器函数:递归处理多维数组,逐项生成。
八、判断两个 Set 是否相同

答案:

const isSameSet = (s1, s2) => { const isSame = (a, b) => { const values = [...a] for (let val of values) { if (!b.has(val)) return false } return true } return isSame(s1, s2) && isSame(s2, s1)}

解析:

  • 子集判断:双向检查确保集合完全相同。
九、数组去重

答案:

const unique = (arr) => [...new Set(arr)]

解析:

  • Set 去重:利用 Set 自动去重特性。
十、字体高亮函数

答案:

const highlight = (strings, ...args) => { return strings.reduce((str, cur, i) => { return `${str}${cur}${args[i] ? `<span class="highlight">${args[i]}</span>` : '' }` }, '')}

解析:

  • 标签模板:处理模板字符串,插入高亮样式。

以上解答覆盖了每个问题的核心逻辑和实现细节,确保代码高效且符合题目要求。