JavaScriptの面接でよく聞かれる質問

文責 Aaron Cao · 更新

JavaScriptの面接でよく聞かれる質問
基礎知識が問われます。クロージャ、イベントループ、thisの束縛、プロトタイプ、そしてvar、let、constによるスコープの使い分けなどです。続いてdebounceの実装や配列のフラット化、Promiseユーティリティの作成といったコーディング演習、さらにイベントデリゲーションのようなブラウザ関連のトピックも出題されます。シニア向けの面接では、asyncパターンとパフォーマンスも加わります。

基礎知識が問われます。クロージャ、イベントループ、thisの束縛、プロトタイプ、そしてvar、let、constによるスコープの使い分けなどです。続いてdebounceの実装や配列のフラット化、Promiseユーティリティの作成といったコーディング演習、さらにイベントデリゲーションのようなブラウザ関連のトピックも出題されます。シニア向けの面接では、asyncパターンとパフォーマンスも加わります。

JavaScriptの基礎で最もよく聞かれるのは?

JavaScriptの出題範囲は無限に見えますが、手当たり次第に問題を解くのはもっとも遠回りなやり方です。この章では、面接官がほぼ毎回立ち返る概念に絞り込み、実際の出題分布に沿って練習できるようにします。ほとんどのスクリーニングをカバーするのは次の五つのトピックです。

  • クロージャ:関数が何を捕捉するか、ループ変数にまつわる定番のバグ、そしてモジュールパターンが機能する理由。
  • イベントループ:コールスタック、タスクキュー、マイクロタスクキュー、そして複合的な例でログがどの順番で出力されるか。
  • thisの束縛:デフォルトバインディング、暗黙のバインディング、callとapplyによる明示的なバインディング、そしてアロー関数がどう違うか。
  • プロトタイプ:プロトタイプチェーンに沿ったプロパティ検索、そしてclass構文が実際にはどうコンパイルされるか。
  • スコープ:varとlet・constの違い、巻き上げ、そして一時的デッドゾーン。

==と===による等価性の型変換、truthiness、そしてmap、filter、reduceのような配列メソッドが、スクリーニング段階の残りを占めます。上記の各項目を一分以内に口頭で説明できれば、基礎ラウンドは通過できます。

どんなコーディング演習を練習すべき?

概念的な質問に加えて、ほとんどのJavaScriptラウンドには、その場で行う短い実装演習が含まれます。定番の出題パターンは数が限られているので、何度も試さなくても数分で解けるようになるまで繰り返し練習する価値があります。

  • debouncethrottleを実装し、それぞれがどんな場面に向いているか説明する。
  • 再帰を使う方法と使わない方法の両方で、ネストした配列をフラット化する。
  • 最初の失敗でrejectされる、簡略版のPromise.allを書く。
  • on、off、emitを備えた小さなイベントエミッターを作る。
  • オブジェクトをディープクローンし、自分の実装が見落としているケースを挙げる。

例えば、ミドルレベルの職種に応募しているフロントエンド候補者であれば、ウォームアップとしてdebounceを出され、続けてそれを検索入力欄に接続し、進行中のリクエストがどうなるかを説明するよう求められるかもしれません。本当のテストはその後の深掘りです。面接官はこの演習を広げていき、あなたの言語理解がどこで尽きるかを見極めます。

言い返してくる面接官相手に声に出して練習することが、内容を定着させる方法です。模擬面接のページでは、フォローアップ質問付きのタイマー練習セッションの進め方を扱っています。

ブラウザとasyncに関する質問はどんな感じですか?

ブラウザ寄りの職種では、言語の基礎の上にもう一層の知識が求められます。イベントデリゲーションが核心です。親要素にたった一つのリスナーを置く方が、子要素それぞれに千個ものリスナーを置くより優れている理由、バブリングがそれをどう成立させるか、そしてキャプチャフェーズがいつ重要になるかが問われます。DOMの更新バッチ処理、レイアウトスラッシング、そして何がリフローを引き起こすかは、パフォーマンス寄りのスクリーニングで登場します。

asyncに関する質問は、ある定型パターンに収束しています。setTimeout、promiseチェーン、async関数が混在したコード片を見て、出力順序を予測するというものです。答えはマイクロタスクとマクロタスクの実行順序次第であり、面接官はその順序自体よりも理由を重視します。await境界をまたぐエラー処理、ネストに対するpromiseチェーンの比較、そしてPromise.raceで複数のリクエストを競わせることも、この分野を締めくくる要素です。

コーディング、行動面接、システム設計といった形式によってこれらのラウンドがどう異なるかは、面接タイプのハブで扱っています。

本番のラウンドに活きる練習法とは?

答えを読むだけだと勉強した気にはなりますが、身にはほとんど付きません。本番のラウンドは声に出して話し、時間を計られ、双方向でやり取りするものなので、練習もそうあるべきです。タイプしながら説明し、フォローアップで遮られ、時計を意識しながら進める模擬セッションをこなしましょう。そのプレッシャーこそが、知識を反射的に引き出せるようにしてくれます。他の言語やスタックに特化した問題集は問題集ハブにあります。

正直に言うと、実際のJavaScriptのラウンドは通常、画面が見える状態で共有エディタ上で行われ、監督付きの試験ではそれが録画されます。AIアシスタントは、そこでの本番共有画面のためではなく、事前の準備と練習のためのものです。画面を共有しない電話スクリーニングや、自分自身の準備セッションのように、リアルタイムの支援が正当な場面では、SubcueAIのオーバーレイは自分のマシン内にとどまり、通話にボットが参加することはありません。

よくある質問

JavaScriptの面接は結局LeetCodeの問題ばかりですか?

通常は違います。一般的なアルゴリズムの問題も出ますが、JavaScript特有のラウンドではクロージャ、イベントループ、thisの束縛といった言語の仕組みに加えて、debounceやイベントエミッターのような小規模な実践的実装が重視されます。

ジュニア開発者が最初に注力すべきことは?

スコープ、クロージャ、配列メソッド、そして==と===の違いをきちんと説明できることです。ジュニア候補者がスクリーニングで落ちるのは、generatorやproxyのような高度なトピックを知らないからというより、基礎が不安定なせいであることの方がずっと多いです。

イベントループをシンプルに説明するには?

一言で言えば、同期的なコードはコールスタック上で実行され、完了したコールバックはキューで待機し、各スタック実行の後、エンジンはタイマーのような次のマクロタスクを取る前に、promiseコールバックのようなマイクロタスクをすべて処理し終えます。そのうえで、ログの出力順序を示す一つの例をたどってみてください。

JavaScriptの面接でTypeScriptは扱われますか?

チームが使っている場合は、扱われることがますます増えています。基本的な型付け、ユニオン型、実務レベルのジェネリクス、そしてTypeScriptが実行時に何を保証し何を保証しないかについての質問が予想されます。それでも、このラウンドを左右するのはJavaScriptの基礎です。

関連する質問

← 詳しく見る: 職種・トピック別の面接質問