返回资讯中心
外部精选
软件工程
#开发者实时流

开发者整理前端 JavaScript 面试问题清单

来源标题:Front End JavaScript Interview Questions

一位开发者在 Free Code Camp 聚会上被问到前端面试练习题后,整理并发布了一份前端 JavaScript 面试问题清单。清单基于其在面试双方的经历编写,分为概念、编码、调试等部分,并计划持续补充答案。

Hacker News 最新ankitg122026/11/4 · 5 天前25 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

几天前,我参加了旧金山的一个 Free Code Camp 聚会(不太了解的朋友可以这样理解:Free Code Camp 是一群聚在一起学习 JavaScript 和 Web 开发的人),有位正在准备前端开发面试的朋友请我提供一些 JavaScript 题目来练习。我搜了一下,没找到一份可以递给她并说“只要你能做出这些,就能拿到工作”的题目列表。有些列表还算接近,有些则很离谱,但全都不完整,或者问的是现实中根本没人会问的问题。

所以,基于我在面试桌两边的经验,就有了下面这份题目。这些是我在招聘前端工程师时问过、也被问过的一些题目。请记住,有些公司(比如 Google)更侧重于设计高效算法,所以如果你想去那里工作,除了下面的内容之外,还应该练习往年的 CodeJam 题目。如果你有题目应该归入这份列表(或者发现我哪里写错了),给我发邮件。

我会在这里补充/更新这些题目的答案(欢迎提交 PR 来补充/改进!)。

我把题目分成了几个部分:概念、编码、调试和系统设计:

能够用语言清楚地解释这些概念(不需要写代码):

实现以下函数(每个问题后面附有测试):

isPrime - 返回 true 或 false,表示给定数字是否为质数。

isPrime(0) // false isPrime(1) // false isPrime(17) // true isPrime(10000000000000) // false

factorial - 返回给定数字的阶乘。

factorial(0) // 1 factorial(1) // 1 factorial(6) // 720

fib - 返回第 n 个斐波那契数。

fib(0) // 0 fib(1) // 1 fib(10) // 55 fib(20) // 6765

isSorted - 返回 true 或 false,表示给定的数字数组是否已排序。

isSorted([]) // true isSorted([-Infinity, -5, 0, 3, 9]) // true isSorted([3, 9, -3, 10]) // false

filter - 实现 filter 函数。

filter([1, 2, 3, 4], (n) => n < 3) // [1, 2]

reduce - 实现 reduce 函数。

reduce([1, 2, 3, 4], (a, b) => a + b, 0) // 10

reverse - 反转给定字符串(是的,使用内置的 reverse 函数属于作弊)。

reverse('') // '' reverse('abcdef') // 'fedcba'

indexOf - 为数组实现 indexOf 函数。

indexOf([1, 2, 3], 1) // 0 indexOf([1, 2, 3], 4) // -1

isPalindrome - 返回 true 或 false,表示给定字符串是否为回文(不区分大小写和空格)。

isPalindrome('') // true isPalindrome('abcdcba') // true isPalindrome('abcd') // false isPalindrome('A man a plan a canal Panama') // true

missing - 接受一个从 1 到某个数 n 的无序唯一数字数组(即没有重复),返回序列中缺失的数字(要么没有缺失数字,要么恰好缺失一个数字)。你能在 O(N) 时间内完成吗?提示:有一个巧妙的公式可以用。

missing([]) // undefined missing([1, 4, 3]) // 2 missing([2, 3, 4]) // 1 missing([5, 1, 4, 2]) // 3 missing([1, 2, 3, 4]) // undefined

isBalanced - 接受一个字符串,返回 true 或 false,表示其花括号是否平衡。

isBalanced('}{') // false isBalanced('\{\{}') // false isBalanced('{}{}') // true isBalanced('foo { bar { baz } boo }') // true isBalanced('foo { bar { baz }') // false isBalanced('foo { bar } }') // false

中级

fib2 - 类似上面实现的 fib 函数,但能够处理最大到 50 的数字(提示:查一下记忆化)。

fib2(0) // 0 fib2(1) // 1 fib2(10) // 55 fib2(50) // 12586269025

isBalanced2 - 类似上面实现的 isBalanced 函数,但支持 3 种括号:花括号 {}、方括号 [] 和圆括号 ()。括号交错的字符串应返回 false。

isBalanced2('(foo { bar (baz) [boo] })') // true isBalanced2('foo { bar { baz }') // false isBalanced2('foo { (bar [baz] } )') // false

uniq - 接受一个数字数组,返回其中的唯一数字。你能在 O(N) 时间内完成吗?

uniq([]) // [] uniq([1, 4, 2, 2, 3, 4, 8]) // [1, 4, 2, 3, 8]

intersection - 求两个数组的交集。你能在 O(M+N) 时间内完成吗(其中 M 和 N 是两个数组的长度)?

intersection([1, 5, 4, 2], [8, 91, 4, 1, 3]) // [4, 1] intersection([1, 5, 4, 2], [7, 12]) // []

sort - 实现 sort 函数,在 O(N×log(N)) 时间内对数字数组进行排序。

sort([]) // [] sort([-4, 1, Infinity, 3, 3, 0]) // [-4, 0, 1, 3, 3, Infinity]

includes - 返回 true 或 false,表示给定数字是否出现在给定的已排序数组中。你能在 O(log(N)) 时间内完成吗?

includes([1, 3, 8, 10], 8) // true includes([1, 3, 8, 8, 15], 15) // true includes([1, 3, 8, 10, 15], 9) // false

assignDeep - 类似 Object.assign,但会深度合并对象。为简单起见,你可以假设对象只能包含数字和其他对象(不包含数组、函数等)。

assignDeep({a: 1}, {}) // { a: 1 } assignDeep({a: 1}, {a: 2}) // { a: 2 } assignDeep({a: 1}, {a: {b: 2}}) // { a: { b: 2 } } assignDeep({a: {b: {c: 1}}}, {a: {b: {d: 2}}, e: 3}) // { a: { b: { c: 1, d: 2 }}, e: 3 }

reduceAsync - 类似你在简单部分实现的 reduce,但每个项必须在继续处理下一个之前完成解析。

let a = () => Promise.resolve('a') let b = () => Promise.resolve('b') let c = () => new Promise((resolve) => setTimeout(() => resolve('c'), 100))

await reduceAsync([a, b, c], (acc, value) => [...acc, value], []) // ['a', 'b', 'c'] await reduceAsync([a, c, b], (acc, value) => [...acc, value], ['d']) // ['d', 'a', 'c', 'b']

基于 reduceAsync 实现 seq。seq 接受一个返回 promise 的函数数组,并依次解析它们。

let a = () => Promise.resolve('a') let b = () => Promise.resolve('b') let c = () => Promise.resolve('c')

await seq([a, b, c]) // ['a', 'b', 'c'] await seq([a, c, b]) // ['a', 'c', 'b']

更难

(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →