Salesforce認定 JavaScript デベロッパー の過去問対策 無料模擬試験です。実際の試験問題ではなく、公式試験ガイド(日本語版)のセクション別出題比率にそのまま準拠して書き起こしたオリジナル問題を、本番と同じ 60問収録しました。全問に解説が付いています。この記事は最後まで無料で読めます。
Salesforce資格の試験対策には、知識を読むだけでなく、問題を解き、間違えた理由を全問解説で確認する勉強法をおすすめします。解いて採点すれば、いまの自分がどのくらいの位置にいるか、どの分野を落としているかが数字で分かります。
Salesforce認定資格 過去問 模擬問 研究所(note.com/sfcertlab)
受験予定の資格が違う方は、こちらから探せます。当研究所では他のSalesforce認定資格の模擬問題集も公開しています。
この無料模試を試験対策に活かす勉強法
公式受験ガイド(日本語版)に記載されている条件に合わせています。
- 問題数:60問(本番は多肢選択方式/複数選択方式の 60 問)
- 制限時間:105分(本番と同じ)
- 合格ライン:65%=39問正解(本番の合格点と同じです)
この無料模試の先に、全500問版があります。
まずは本記事で現在地を確認してください。試験対策の演習量を先に確保したい方は、同じ密度の全問解説が付いた全500問・全問解説付き問題集へ進めます。
※本記事の60問は、全500問版にも含まれています。
先に60問を解き切ってください。 解答と解説はこの記事の後半にまとめてあります。1問ごとに答えを見てしまうと、本番と同じ条件で現在地を測れません。紙かメモアプリに「問1 A」のように書き出しながら進めるのがおすすめです。
問題編(全60問)
1. 変数、データ型、コレクション
問1. [難易度:基礎]
関数内のifブロックで宣言した変数を、同じ関数のブロック外からも参照したい。関数の外部には公開しない場合、該当する宣言はどれか。
A. ブロックの先頭でconstを使って宣言する。
B. ifブロック内でletを使って宣言する。
C. 関数の外側でletを使って宣言する。
D. ifブロック内でvarを使って宣言する。
問2. [難易度:難問]
forループ内でlet iを宣言し、各反復でsetTimeoutのコールバックを登録している。各コールバックが異なるiの値を保持できる理由として最も適切なものはどれか。
A. letは関数全体で1つの束縛だけを作り、実行後に値を複製するから。
B. setTimeoutがiをグローバルオブジェクトのプロパティへ変換するから。
C. コールバックの実行時にiが未宣言なら、自動的に添字を再計算するから。
D. letはブロックスコープを持ち、forの各反復に対応する束縛が作られるから。
問3. [難易度:基礎]
constで宣言した配列itemsについて、JavaScriptの規則に照らして実行可能な操作はどれか。
A. items.push("new")を実行して、参照先の配列へ要素を追加する。
B. items = []を実行して、元の配列から新しい空配列へ束縛を差し替える。
C. 同じスコープでconst itemsをもう一度宣言する。
D. itemsを宣言時に初期化せず、後の文で配列を代入する。
問4. [難易度:シナリオ応用]
Cloud Kicks社の関数では、console.log(total)の後にvar total = 10がある。ログがReferenceErrorではなくundefinedを出力する理由として最も適切なものはどれか。
A. var宣言が関数スコープの先頭で宣言されたように処理され、代入前の値はundefinedだから。
B. console.logが未宣言の識別子を常に文字列undefinedへ変換するから。
C. varの代入式全体が宣言より前へ移動し、10が一度消去されるから。
D. totalが見つからない場合、グローバル変数として自動作成されるから。
問5. [難易度:基礎]
同じブロックの先頭で変数countを読み取り、その後にlet count = 1と宣言した。読み取り時の挙動はどれか。
A. varと同じようにundefinedが返される。
B. 宣言文が無視され、外側の同名変数が必ず使われる。
C. 一時的デッドゾーン内の参照となりReferenceErrorが発生する。
D. letの初期値として数値0が自動設定される。
問6. [難易度:基礎]
ブラウザーやワーカーなど実行環境ごとの名前に依存せず、グローバルなthis値へアクセスする標準プロパティはどれか。
A. documentElementを参照する。
B. globalThisを参照する。
C. module.exportsを参照する。
D. localStorageを参照する。
問7. [難易度:難問]
JavaScriptのプリミティブ値とオブジェクトについて、正しい記述はどれか。
2つ選択してください。
A. 文字列プリミティブは不変であり、文字位置へ代入して元の値を変更できない。
B. オブジェクトは参照を通じて扱われ、同じオブジェクトを指す複数の変数から変更が見える。
C. nullはプロパティを自由に追加できる空のオブジェクトである。
D. 数値プリミティブはnew Numberで作ったオブジェクトと厳密等価になる。
問8. [難易度:基礎]
JavaScriptで値undefinedが生じる代表的な状況はどれか。
A. オブジェクトリテラルを作成すると、すべてのプロパティがundefinedになる。
B. 宣言済みだが値を代入していない変数を読み取る。
C. 存在しない識別子を読むと、例外ではなく常にundefinedになる。
D. nullをBooleanへ変換すると、undefinedへ変化する。
問9. [難易度:シナリオ応用]
Universal Containers社の開発者は、API応答の担当者項目が意図的に「値なし」である場合にnullを保存した。nullの意味と型判定について適切な記述はどれか。
2つ選択してください。
A. nullは宣言されていない識別子を参照したときだけ自動生成される。
B. typeof nullは仕様上"null"という文字列を返す。
C. nullは値が存在しないことを意図的に表すプリミティブ値として使用できる。
D. typeof nullの結果は歴史的な仕様により"object"になる。
問10. [難易度:シナリオ応用]
Northern Trail Outfitters社の注文画面では、任意入力の備考が空なら警告を表示し、文字があれば処理を続ける。開発者は入力値を明示的な論理値へ変換し、その結果を後段でも利用したい。適切な実装はどれか。
A. new Boolean(note)を作成し、そのオブジェクトを条件式で評価する。
B. note == falseの比較結果だけを入力済みの判定として利用する。
C. Boolean(note)を呼び出し、空文字列ならfalseとなる結果を利用する。
D. String(note)を呼び出し、変換後の文字列を論理値として保存する。
問11. [難易度:シナリオ応用]
AW Computing社の料金計算で0.1と0.2を加算した値を0.3と厳密比較するとfalseになった。金額を整数の最小通貨単位へ置き換えられない箇所で、この差が浮動小数点の丸め誤差かを判定したい。適切な方法はどれか。
A. 加算前の各値へparseIntを適用し、整数部分だけを比較する。
B. 結果をStringへ変換し、先頭3文字が"0.3"かを比較する。
C. 両辺をNumber.MAX_VALUEで割ってから厳密等価で比較する。
D. Math.abs(result - 0.3)が許容誤差より小さいかを比較する。
問12. [難易度:難問]
Ursa Major Solar社の集計処理では、parseFloatで変換できない値が混ざると以降の算術結果もNaNになる。文字列を暗黙に数値変換せず、計算結果そのものがNaNかを判定したい。最も適切な実装はどれか。
A. result === NaNを評価し、trueなら変換失敗と判定する。
B. typeof result === "NaN"を評価して数値型と区別する。
C. Number.isNaN(result)を使い、NaNである場合だけtrueを得る。
D. Boolean(result)を使い、falseならNaNだけが原因だと判定する。
問13. [難易度:シナリオ応用]
AW Computing社の比率計算で分母が0になる入力があり、JavaScriptのNumber演算では例外ではなく特殊値が返った。結果を後続処理へ渡す前に、有限の数値だけを受け入れたい。正しい対応はどれか。
A. try...catchだけで1 / 0の例外を捕捉し、結果の確認は省略する。
B. 結果がNumber.MAX_VALUE以下なら、必ず有限であるとみなす。
C. 結果をparseIntへ渡せば、Infinityが最大整数へ変換される。
D. Number.isFinite(result)を評価し、falseなら処理を中止する。
問14. [難易度:シナリオ応用]
Cloud Kicks社は安全な整数範囲を超える注文番号の計算にBigIntを採用した。既存コードにはNumberとの混在と除算があるため、移行時の制約を把握したい。BigIntの演算について正しいものはどれか。
2つ選択してください。
A. 算術演算では通常、BigIntとNumberを直接混在させるとTypeErrorになる。
B. BigIntの除算は常に小数部を保持し、結果をNumberとして返す。
C. BigInt同士の除算結果では、小数部が0方向へ切り捨てられる。
D. MathオブジェクトのすべてのメソッドがBigIntをそのまま受け付ける。
2. オブジェクト、関数、クラス
問15. [難易度:難問]
変数fieldNameの値をプロパティ名として使い、同時に固定プロパティactiveも持つ新しいオブジェクトを、オブジェクトリテラルだけで作成したい。最も適切なコードはどれか。
A. const item = Object.create(fieldName, { active: true });
B. const item = { fieldName: value }; item.prototype.active = true;
C. const item = new Object(fieldName, value, active);
D. const item = { [fieldName]: value, active: true };
問16. [難易度:シナリオ応用]
Ursa Major Solar社のオブジェクトには"panel-size"というプロパティがあり、別の変数keyにも参照したいプロパティ名が入っている。両方に対応できるアクセス方法はどれか。
A. 常にドット記法だけを使い、object.panel-sizeを有効な単一プロパティ参照として記述する。
B. プロパティ名を関数呼び出しにしてobject(key)と記述する。
C. object.keyと書けば、key変数の値が自動的に展開される。
D. object["panel-size"]およびobject[key]のブラケット記法を使う。
問17. [難易度:シナリオ応用]
Northern Trail Outfitters社では、変数localeの値が"ja"なら{ ja: "こんにちは" }となるオブジェクトをリテラルで作りたい。適切な記述はどれか。
A. const labels = { locale: "こんにちは" };
B. const labels = { .locale: "こんにちは" };
C. const labels = { locale(): "こんにちは" };
D. const labels = { [locale]: "こんにちは" };
問18. [難易度:シナリオ応用]
Northern Trail Outfitters社のオブジェクトorderは、プロトタイプからregionを継承し、自身にはtotalを持つ。order自身にregionが定義されているかだけを判定する方法はどれか。
A. "region" in orderだけを使い、真なら必ず自身のプロパティとみなす。
B. order.region !== undefinedなら必ず自身のプロパティとみなす。
C. Object.hasOwn(order, "region")を使って自身のプロパティか確認する。
D. Object.keys(Object.getPrototypeOf(order))だけでorder自身を検査する。
問19. [難易度:基礎]
通常のオブジェクトについて、Object.keys(obj)の結果へ含まれるプロパティはどれか。
A. プロトタイプチェーン上の列挙不可プロパティだけが含まれる。
B. シンボルを含む、自身と継承元の全プロパティが含まれる。
C. obj自身が持つ列挙可能な文字列キーのプロパティが含まれる。
D. configurableがfalseであるプロパティだけが含まれる。
問20. [難易度:シナリオ応用]
Universal Containers社は設定オブジェクトの自身の列挙可能プロパティについて、キーと値の組を反復したい。最も直接的な方法はどれか。
A. Object.keys(config)で値だけの配列を受け取る。
B. Object.entries(config)で[key, value]の組の配列を受け取る。
C. Object.values(config)でキーだけの配列を受け取る。
D. Object.getPrototypeOf(config)でキーと値の組を受け取る。
問21. [難易度:基礎]
データプロパティの記述子にあるwritable、enumerable、configurableの役割の組み合わせとして正しいものはどれか。
A. writableは列挙可否、enumerableは削除可否、configurableは値の型を決める。
B. writableは継承可否、enumerableは再代入可否、configurableは読取可否を決める。
C. writableは値の変更可否、enumerableは列挙可否、configurableは再定義や削除の可否を制御する。
D. 3つはいずれも同じ意味で、falseならプロパティを一切読み取れない。
問22. [難易度:シナリオ応用]
Cloud Kicks社はconfigオブジェクトへversionプロパティを追加し、値の変更は許可する一方、Object.keysの列挙には出さず、削除や属性の再定義も禁止したい。Object.definePropertyの記述子で有効にすべき属性はどれか。
2つ選択してください。
A. writableをtrueにして、versionの値を後から変更できるようにする。
B. enumerableをtrueにして、Object.keysからversionを隠す。
C. configurableをtrueにして、削除と再定義を禁止する。
D. enumerableとconfigurableをfalseにして、列挙せず再定義も許可しない。
問23. [難易度:シナリオ応用]
オブジェクトリテラルにgetterを定義する。構文上正しいものはどれか。
A. const item = { get label() { return this.name; } };
B. const item = { get label(value) { return value; } };
C. const item = { getter label => this.name };
D. const item = { get: label() { return this.name; } };
問24. [難易度:シナリオ応用]
Universal Containers社の開発者はconst original = {name: "A", address: {city: "Tokyo"}}から編集用コピーを作るためconst copy = {...original}を実行した。その後copy.address.city = "Osaka"とするとoriginal側も変わった。理由として正しいものはどれか。
A. スプレッド構文によるオブジェクト複製はシャローコピーで、入れ子の参照は共有される。
B. スプレッド構文は常に元オブジェクトを返し、新しい外側オブジェクトも作らない。
C. constで宣言したオブジェクトは、すべての子プロパティが自動的に同期される。
D. cityが文字列プリミティブなので、すべてのオブジェクト間で同じ値を共有する。
問25. [難易度:シナリオ応用]
オブジェクト初期化子で有効なメソッド定義構文はどれか。
2つ選択してください。
A. { total: () => 0 }はアロー関数値を持つため、メソッド定義構文そのものである。
B. { total() { return 0; } }は短縮されたメソッド定義として有効である。
C. { ["to" + "tal"]() { return 0; } }は算出名のメソッド定義として有効である。
D. { function total() { return 0; } }はオブジェクト初期化子内の正しい構文である。
問26. [難易度:シナリオ応用]
AW Computing社の通常関数show(){ return this.name; }は、ある場面ではcustomerのメソッドとして、別の場面ではshow.call(admin)として呼ばれる。2回目のthisが参照する対象として正しいものはどれか。
A. 関数を最初に定義したファイルのモジュールオブジェクトを常に参照する。
B. 直前にcustomerのメソッドとして呼んだため、以降もcustomerへ固定される。
C. callの第1引数として明示されたadminを参照する。
D. 通常関数のthisは常に字句スコープから決まるので変更できない。
問27. [難易度:基礎]
account.getName()のように通常関数をオブジェクトのメソッドとして呼び出した。getName内のthisは通常どの値になるか。
A. getName関数のprototypeオブジェクトになる。
B. ドットの左側でメソッドを受け取るaccountになる。
C. getNameが宣言されたソースファイルの文字列になる。
D. 呼び出し時の引数配列そのものになる。
問28. [難易度:シナリオ応用]
Northern Trail Outfitters社のオブジェクトでは、通常メソッド内の配列処理でコールバックからthis.taxRateを参照したい。コールバック専用のthisを作らず、外側メソッドのthisを保持する実装はどれか。
A. コールバックを通常関数で書き、呼び出し元に関係なくthisが外側から継承されると仮定する。
B. コールバック内でnew this()を実行し、外側オブジェクトを再構築する。
C. 外側メソッド自体をアロー関数のプロパティにし、呼び出し側のthisを受け取る。
D. 配列コールバックをアロー関数で書き、外側の字句的thisを参照する。
問29. [難易度:基礎]
Function.prototype.call()とapply()を使って通常関数のthisを明示する場合、両者の主な違いとして正しいものはどれか。
A. callは非同期で実行し、applyは同期的に実行する。
B. callは新しい束縛済み関数を返し、applyは元の関数を書き換える。
C. callは引数を個別に渡し、applyは引数を配列風オブジェクトで渡す。
D. callはクラス専用で、applyはアロー関数専用である。
3. ブラウザとイベント
問30. [難易度:基礎]
DOMにおけるHTML文書の表現について正しいものはどれか。
A. 文書はノードのツリーとして表現され、要素やテキストに親子関係がある。
B. 文書内のすべての要素は階層を形成せず、互いに親を持たない独立した配列要素としてだけ保持される。
C. DOMツリーには要素だけが含まれ、テキストはノードとして扱われない。
D. 同じ文書の各ノードは必ず1つの共通親を直接持つ。
問31. [難易度:基礎]
文書内でCSSセレクター.cardsに一致するすべての要素を取得したい。適切なメソッドはどれか。
A. document.getElementById(".cards")を使用する。
B. document.querySelector(".cards")を使用する。
C. document.querySelectorAll(".cards")を使用する。
D. document.createElement(".cards")を使用する。
問32. [難易度:シナリオ応用]
Northern Trail Outfitters社のページにはid="order-summary"の要素が1つある。CSSセレクターの構文を組み立てず、ID値で直接取得する方法として最も適切なものはどれか。
A. document.getElementsByClassName("order-summary")を呼び出す。
B. document.getElementById("order-summary")を呼び出す。
C. document.createElement("order-summary")を呼び出す。
D. document.querySelectorAll("order-summary")を呼び出す。
問33. [難易度:シナリオ応用]
DOMを調査すると、p要素の中に表示文字列を表す子ノードがある。要素そのものと文字列部分を区別する説明として最も適切なものはどれか。
A. pはElementノードで、内部の文字列は別のTextノードとして表現される。
B. pと文字列はどちらもDocumentノードとして同じ種類になる。
C. 文字列はp要素の属性ノードとしてのみ保持される。
D. pはTextノードで、その親が文字列を表すElementノードになる。
問34. [難易度:シナリオ応用]
既存のul要素へ、文字列「完了」を表示する新しいli要素をDOMメソッドで組み立てたい。最も適切な手順はどれか。
A. createTextNode("li")で要素を作り、その属性へ「完了」を代入する。
B. querySelector("完了")でテキストを作り、createElementで検索する。
C. createElement("li")で要素を作り、createTextNode("完了")の結果を子にする。
D. getElementById("li")で新規要素を作り、removeで文字列を追加する。
問35. [難易度:難問]
既存divへ文字列と複数ノードを一度に末尾追加したい。戻り値には依存しない。appendChildではなくappendを選ぶ理由として最も適切なものはどれか。
A. appendは追加した最後のノードを返すため、連続呼び出しに必須である。
B. appendは複数のNodeまたは文字列を受け取れるが、appendChildは1つのNodeを受け取る。
C. appendChildは複数の文字列引数だけを受け取り、それぞれを自動的にTextノードへ変換して追加する。
D. appendは親の先頭へ挿入し、appendChildは親の末尾へ挿入する。
問36. [難易度:シナリオ応用]
親ノードparentの子oldNodeをnewNodeへ置き換え、置換前のノードも後続処理で使いたい。replaceChild()について正しい説明はどれか。
2つ選択してください。
A. parent.replaceChild(newNode, oldNode)の順で呼び出す。
B. 戻り値は置き換えられたoldNodeである。
C. oldNode.replaceChild(parent, newNode)の順で呼び出す。
D. 戻り値は常にundefinedである。
問37. [難易度:シナリオ応用]
img要素のalt属性を読みたい。属性が存在しない場合も含め、getAttribute('alt')の説明として最も適切なものはどれか。
A. 属性があれば文字列を返し、存在しなければnullを返す。
B. 属性がなければ空配列を返す。
C. 属性があれば必ず真偽値を返す。
D. 属性を読み取ると同時に削除する。
問38. [難易度:シナリオ応用]
選択された行にクラスactiveがなければ追加し、あれば削除したい。最も簡潔で適切な方法はどれか。
A. row.classList.toggle("active")を呼び出す。
B. row.className.add("active")を呼び出す。
C. row.style.toggle("active")を呼び出す。
D. row.getAttribute("active")だけを呼び出す。
問39. [難易度:難問]
Ursa Major Solar社の要素は、外部スタイルシートと継承によって最終的な色が決まっている。element.style.colorが空文字列だった場合でも、実際に計算された色を取得する方法はどれか。
A. element.getAttribute("style").colorを参照する。
B. document.styleSheets.color(element)を呼び出す。
C. getComputedStyle(element).colorを参照する。
D. element.classList.value.colorを参照する。
4. デバッグとエラーハンドリング
問40. [難易度:シナリオ応用]
Northern Trail Outfitters社のスクリプトに閉じ括弧が不足している。ファイルを読み込むと、処理本体のログが一度も出ないままSyntaxErrorになった。この状況の説明として適切な記述はどれか。
2つ選択してください。
A. エンジンがコードを構文解析する段階で不正な構文を検出している。
B. 不足した括弧は実行時に自動補完され、次の文でTypeErrorになる。
C. 解析を完了できないため、該当スクリプトの通常実行は開始されない。
D. エラーは未宣言の変数参照を表すため、ReferenceErrorへ変換される。
問41. [難易度:基礎]
宣言されていない識別子customerTotalを式の中で読み取った。JavaScriptが通常送出するエラーはどれか。
A. 数値パラメーターが許容範囲を外れたものとしてRangeErrorが送出される。
B. 有効な束縛を見つけられないためReferenceErrorが送出される。
C. 式の構文が必ず不正になるためSyntaxErrorが送出される。
D. 数値へ変換できないため一律にTypeErrorが送出される。
問42. [難易度:シナリオ応用]
customerがnullであるにもかかわらずcustomer.nameを読み取った。発生する可能性が最も高いエラーはどれか。
A. 数値の桁数が範囲外なのでRangeErrorになる。
B. コードの字句解析に失敗するためSyntaxErrorになる。
C. nullに対してプロパティを読み取れないためTypeErrorになる。
D. customerという識別子が宣言済みでもReferenceErrorになる。
問43. [難易度:シナリオ応用]
数値123.45に対してtoFixed(101)を呼び出したところ例外になった。最も適切な説明はどれか。
A. 小数を文字列へ変換するため、常にTypeErrorになる。
B. toFixedの呼び出しは文法違反なのでSyntaxErrorになる。
C. 小数点以下の桁数が許容範囲外なのでRangeErrorになる。
D. toFixedという識別子がグローバルにないためReferenceErrorになる。
5. 非同期プログラミング
問44. [難易度:シナリオ応用]
Cloud Kicks社の画面で、データ取得を開始した直後に「完了」と表示され、取得結果はその後に届いている。非同期関数がPromiseを返す場合、表示を取得完了後に行う修正として最も適切なものはどれか。
A. データ取得の直前に完了メッセージを同期的に表示する。
B. 取得関数をsetIntervalで繰り返し呼び出して結果を待つ。
C. 返されたPromiseの履行後に表示処理を実行する。
D. 取得関数の返値を直ちに文字列へ変換して表示する。
問45. [難易度:基礎]
非同期APIへコールバック関数を渡す主な目的として最も適切なものはどれか。
A. APIの開始前に、呼び出し元の変数をすべて複製するため。
B. 非同期操作が完了した時点で実行する処理を指定するため。
C. JavaScriptエンジンの実行スレッドを追加するため。
D. 非同期APIを必ず同期処理へ変換するため。
問46. [難易度:シナリオ応用]
3つの非同期処理をコールバックで順番に実行したコードが深く入れ子になり、エラー処理も各階層に散らばっている。可読性と処理の連鎖を改善する方針として最も適切なものはどれか。
A. 各処理がPromiseを返すようにし、thenやcatchで直列のチェーンを構成する。
B. すべてのコールバックを同じ関数名と同じ引数構成に変更し、現在の入れ子構造をそのまま維持する。
C. 各非同期処理をwhileループで完了まで繰り返し呼び出す。
D. コールバックをグローバル変数へ保存し、実行順を暗黙に任せる。
問47. [難易度:基礎]
JavaScriptのイベントループが担う役割として最も適切なものはどれか。
A. すべての関数を同時に複数スレッドで実行する。
B. 同期処理の途中へ待機中のコールバックを強制挿入する。
C. 各変数の型を反復ごとに静的検査する。
D. 実行スタックが空いたとき、キューの処理を実行へ進める。
問48. [難易度:難問]
Ursa Major Solar社の画面でクリックイベントの処理中にsetTimeout(fn, 0)を登録した。同じイベントハンドラー内の残りの同期処理との順序について最も適切な説明はどれか。
A. fnは登録行の直後に現在のイベントハンドラーへ割り込み、残っているすべての同期文より先に動く。
B. 遅延が0ならfnはマイクロタスクキューの先頭で直ちに動く。
C. fnは別スレッドで必ず同期処理と同時に実行される。
D. fnはタイマー満了後にタスクとして待機し、現在の処理が終わった後に実行機会を得る。
問49. [難易度:シナリオ応用]
Universal Containers社のコードは、解決済みPromiseのthenとsetTimeout(fn, 0)を同じ同期処理内で登録している。同期ログの後、通常どちらが先に実行されるか。
A. タイマーのコールバックが、現在の同期処理を中断して先に実行される。
B. thenの反応がマイクロタスクとして、次のタイマータスクより先に実行される。
C. 登録順に関係なく、両方が同じ呼び出しスタックで同時に実行される。
D. Promiseの反応はページのloadイベントまで実行されない。
問50. [難易度:基礎]
同期コード内でPromise.resolve().then(promiseHandler)とsetTimeout(timerHandler, 0)をこの順に登録した。同期処理終了後の通常の実行順序はどれか。
A. timerHandlerが常に先で、その後にpromiseHandlerが動く。
B. promiseHandlerがマイクロタスクとして先に動き、その後にtimerHandlerが動く。
C. 2つは同じ実行スタックへ入り、登録行で同時に動く。
D. どちらも明示的にイベントを送出するまで実行されない。
問51. [難易度:基礎]
現在の同期処理が終了した直後、次のタスクへ移る前に関数reconcileを実行するよう明示的に登録するAPIはどれか。
A. queueMicrotask(reconcile)を呼び出す。
B. setInterval(reconcile, 0)を呼び出す。
C. requestAnimationFrame(reconcile)を必ず同期実行として呼び出す。
D. dispatchEvent(reconcile)で関数をイベントへ変換する。
6. サーバーサイド JavaScript
問52. [難易度:シナリオ応用]
Universal Containers社は、ブラウザーを開かずに夜間バッチで多数のJSONファイルを処理するJavaScriptプログラムを運用したい。サーバー上で実行する基盤として最も適切なものはどれか。
A. Node.jsを使い、OS上のJavaScriptランタイムとして処理を実行する。
B. DOMを使い、HTML文書の要素として各JSONファイルを読み込む。
C. Web Storageを使い、サーバーのファイルをsessionStorageへ保存する。
D. Service Workerを使い、開いているページの背後で夜間処理を続ける。
問53. [難易度:シナリオ応用]
同じJavaScriptファイルをブラウザーとNode.jsの両方で実行したところ、ブラウザーで使えたwindowへの参照がNode.jsでは失敗した。環境差を吸収してグローバルオブジェクトへアクセスする方法として最も適切なものはどれか。
A. 両方の環境で標準化されているglobalThisを参照する。
B. Node.jsでもwindowが暗黙に作られるまで処理を遅延する。
C. ブラウザー側のdocumentをNode.jsのグローバルへ代入する。
D. すべての変数をvarで宣言してwindowを生成する。
問54. [難易度:シナリオ応用]
Node.jsの説明として最も適切なものはどれか。
A. ブラウザーのDOMだけを操作するためのマークアップ言語である。
B. スケーラブルなネットワークアプリケーション向けの、非同期でイベント駆動型のJavaScriptランタイムである。
C. ApexコードをJavaScriptへ変換するSalesforce専用コンパイラーである。
D. JavaScriptを使用せず、CSSだけをサーバーで実行するツールである。
問55. [難易度:基礎]
Node.jsで実行するJavaScriptの同期処理が長時間かかる場合、同じ実行スレッドに待機するほかの処理への影響として適切なものはどれか。
A. 現在の同期処理が完了してスタックを明け渡すまで、待機中の処理は実行を開始できない。
B. 同期処理は自動的に複数のCPUへ分割され、待機中の処理と必ず同時実行される。
C. 同期処理を開始するとイベントループとキューは永久に削除される。
D. 同期処理の途中へタイマーが必ず割り込み、残りの文を破棄する。
問56. [難易度:シナリオ応用]
AW Computing社のECMAScriptモジュールmain.jsから、同じディレクトリーのcalculator.jsが名前付きで公開するadd関数を読み込みたい。適切な記述はどれか。
A. export { add } from "./calculator.js" をmain.jsの呼び出し式として使う。
B. document.load("./calculator.js", "add") を呼び出す。
C. module.exports("./calculator.js").addを呼び出す。
D. import { add } from "./calculator.js" と宣言する。
7. テスト
問57. [難易度:シナリオ応用]
Northern Trail Outfitters社では税額計算の単体テストが外部API停止に連動して失敗する。単体テストの分離の原則に沿う対応はどれか。
A. 画面からデータベースまで常に全体を起動する。
B. 本番APIの障害も計算関数の合否に含める。
C. 外部依存をモックし、税額計算の入力と戻り値を小さな単位で検証する。
D. アサーションを削除して通信成功だけを見る。
問58. [難易度:シナリオ応用]
Cloud Kicks社の開発者は配列[2, 4, 6]の全要素が偶数かをテストする。期待どおりtrueを返す式はどれか。
A. [2, 4, 6].some(n => n % 2 === 0)は全要素を保証する。
B. [2, 4, 6].filter(Boolean) === true
C. [2, 4, 6].map(n => n % 2)は真偽値を返す。
D. [2, 4, 6].every(n => n % 2 === 0)
問59. [難易度:基礎]
ネストしたテストデータを、元のオブジェクトと参照を共有しない複製にしたい。最も適切な方法はどれか。
A. copy = dataと代入する。
B. トップレベルの参照をそのまま再利用する。
C. 元データを各テストで直接変更する。
D. structuredClone(data)を使う。
問60. [難易度:シナリオ応用]
Universal Containers社では、数値結果のテストで、値がNaNかどうかを型変換せず判定したい。正しい説明はどれか。
2つ選択してください。
A. グローバルisNaN()は引数を型変換せず判定する。
B. NaN === NaNはtrueになる。
C. Number.isNaN(NaN)はtrueを返す。
D. Number.isNaN('NaN')はfalseを返す。
解答一覧
ここから答え合わせです。まだ解き終えていない方は戻ってください。
問1 D / 問2 D / 問3 A / 問4 A / 問5 C / 問6 B / 問7 A、B / 問8 B / 問9 C、D / 問10 C
問11 D / 問12 C / 問13 D / 問14 A、C / 問15 D / 問16 D / 問17 D / 問18 C / 問19 C / 問20 B
問21 C / 問22 A、D / 問23 A / 問24 A / 問25 B、C / 問26 C / 問27 B / 問28 D / 問29 C / 問30 A
問31 C / 問32 B / 問33 A / 問34 C / 問35 B / 問36 A、B / 問37 A / 問38 A / 問39 C / 問40 A、C
問41 B / 問42 C / 問43 C / 問44 C / 問45 B / 問46 A / 問47 D / 問48 D / 問49 B / 問50 B
問51 A / 問52 A / 問53 A / 問54 B / 問55 A / 問56 D / 問57 C / 問58 D / 問59 D / 問60 C、D
採点と判定
結果はいかがでしたか。正解数から、いまの状況を把握しましょう。
39問以上(65%以上)
合格ラインに乗っています。ただし本番は初見の問題ばかりですし、この模試より緊張もするはずです。ここからはシナリオ問題と難問層をどれだけ潰せるかが差になります。
33〜38問
あと一歩です。取りこぼしている分野がはっきりしているはずなので、次の「セクション別の正答率シート」で弱点を特定してください。この層は演習量を積めば最も伸びます。シナリオ問題で時間を使いすぎていないかも振り返ってみてください。
32問以下
基礎領域に抜けがあります。いま受験しても厳しい結果になる可能性が高いので、分野ごとに演習量を積むことを先にしてください。
どの結果でも共通して言えること
当研究所が実際に受験してきた範囲では、シナリオ形式の問題が多く出ます。状況設定を読み解いたうえで最適な設定を選ばせてくるので、用語を覚えているだけでは手が止まりますし、思っている以上に頭と時間を使います。ここに慣れているかどうかが、同じ知識量でも結果を分けます。
本記事では60問中35問(58%)をシナリオ形式にしました。形式ごとの内訳は公式試験ガイドに公表されていないため、これは当研究所の判断による配分です。実際に受験してきた経験から、これくらいは身構えて臨んだほうがよいと考えています。
解き直すときは正解を確かめるだけでなく、問題文のどこを手がかりに絞り込んだのかを言葉にしてみてください。それが本番で効きます。
セクション別の正答率シート
問番号はセクション順に並んでいます。分野ごとに正解数を数えると、どこを重点的にやり直すべきかが分かります。
- 変数、データ型、コレクション:問1〜問14(14問) 正解した数 __ / 14
- オブジェクト、関数、クラス:問15〜問29(15問) 正解した数 __ / 15
- ブラウザとイベント:問30〜問39(10問) 正解した数 __ / 10
- デバッグとエラーハンドリング:問40〜問43(4問) 正解した数 __ / 4
- 非同期プログラミング:問44〜問51(8問) 正解した数 __ / 8
- サーバーサイド JavaScript:問52〜問56(5問) 正解した数 __ / 5
- テスト:問57〜問60(4問) 正解した数 __ / 4
落とした分野をどう埋めるか
セクション別の正答率が出たら、次にやることは決まっています。落とした分野の演習量を積むことです。
まずはこのあとの全問解説で、60問ぶんの取りこぼしを潰してください。そのうえで演習量が足りないと感じたら、同じ密度の解説が付いた全500問の問題集があります。本記事の60問もこの中に含まれています。
全問解説(全60問)
正解の理由だけでなく、誤りの選択肢がなぜ誤りなのかまで書いています。間違えた問題はもちろん、迷って正解した問題も読んでおくと取りこぼしが減ります。
1. 変数、データ型、コレクション
問1. 正解:D
Dのvarは関数スコープを持つため、ifブロック内の宣言でも同じ関数内から参照できる。AのconstとBのletはブロックスコープなので、ブロック外では参照できない。Cは参照自体は可能になるが関数外にも束縛が存在し、「関数の外部には公開しない」という条件を満たさない。
問2. 正解:D
Dのとおり、for文の初期化部でletを使うと反復ごとに新しい字句的な束縛が作られ、各クロージャーは対応する値を参照できる。Aはvarに近い説明で、letの反復単位の束縛を表さない。BはsetTimeoutが変数をグローバル化することはない。Cも未宣言名の自動計算という仕組みは存在しない。
問3. 正解:A
Aはconstの束縛自体を変更せず、参照先の配列を変更する操作なので実行できる。Bは束縛への再代入であり認められない。Cは同一スコープでの再宣言になる。Dのconst宣言には初期化子が必要で、後から初回代入する使い方はできない。constは値の不変性ではなく束縛の再代入禁止を定める。
問4. 正解:A
Aのとおりvar宣言はスコープ内で巻き上げられたように扱われるが、初期化式の代入は元の位置で実行されるため、先行参照時はundefinedになる。Bはconsole.log固有の変換ではない。Cは代入まで巻き上がるわけではない。Dは宣言自体が関数スコープに存在し、暗黙のグローバル生成で説明する場面ではない。
問5. 正解:C
Cが正しい。letやconstの束縛はブロック開始から存在するものの、宣言の実行まで初期化されない一時的デッドゾーンにあり、そこでの参照はReferenceErrorになる。Aはvarの巻き上げ時の挙動との混同である。Bは内側の束縛が外側を隠すため必ず外側へ解決されない。Dに数値0を自動設定する規則はない。
問6. 正解:B
BのglobalThisは環境に応じたグローバルなthis値へ統一的にアクセスする標準プロパティである。AのdocumentElementはHTML文書のルート要素で、グローバルスコープではない。CはCommonJSモジュールの公開値を表す。Dはブラウザーの保存領域であり、グローバルオブジェクトそのものを指さない。
問7. 正解:A、B
AとBが正しい。プリミティブ値は不変で、文字列の一部を直接書き換えられない。オブジェクト値は参照が共有されるため、一方の参照からの変更を他方でも観測できる。Cのnullにはプロパティを追加できず、オブジェクトとして操作するとTypeErrorになる。Dは数値プリミティブとNumberオブジェクトで型が異なり、厳密等価ではない。
問8. 正解:B
Bが代表例で、初期値を与えず宣言した変数の値はundefinedになる。Aは明示したプロパティ値まで一律にundefinedへ変えるものではない。Cの存在しない識別子への参照は通常ReferenceErrorである。DのnullをBooleanへ変換した結果はfalseであり、値undefinedへ変化するわけではない。undefinedは未設定を表すプリミティブ値である。
問9. 正解:C、D
CとDが正しい。nullはオブジェクトが存在しないなど、値の意図的な欠如を表すプリミティブ値であり、typeof nullは歴史的理由から"object"を返す。Aの未宣言識別子参照は通常ReferenceErrorで、nullを自動生成しない。Bは直感的に見えるが、実際のtypeof結果は"null"ではないため型判定時に注意が必要である。
問10. 正解:C
CはBooleanを関数として呼び出し、空文字列をfalse、空でない文字列をtrueへ変換する。Aのnew Boolean(false)もオブジェクト自体は真値なので条件判定を誤る。Bの緩い等価比較は真値・偽値の判定と同義ではない。Dは文字列変換であり、たとえば"false"という文字列も真値のままである。
問11. 正解:D
Dは二進浮動小数点で生じる微小な差を許容範囲で評価する方法である。Aは小数部分を失うため料金計算そのものを壊す。Bは表示文字列への依存で、桁数や指数表記が変わると成立しない。Cは巨大値で割っても厳密等価比較の性質は変わらず、比較対象の意味も失われる。
問12. 正解:C
Cは型変換を行わず、引数が数値型のNaNである場合だけtrueを返す。AはNaNが自分自身を含むどの値とも等しくないため常にfalseになる。Bでtypeof NaNは"number"であり"NaN"ではない。Dは0、-0、NaNがいずれも偽値なので、NaNだけを識別できない。
問13. 正解:D
DはNaN、Infinity、-Infinityを除き、有限なNumberだけを受け入れられる。JavaScriptのNumberでは1 / 0がInfinityになるためAのcatchは作動しない。BはInfinityとの比較を適切に排除する検査ではなく、NaNも扱えない。CでparseInt(Infinity)は有限の最大整数にはならずNaNになる。
問14. 正解:A、C
Aのとおり多くの算術演算でBigIntとNumberは直接混在できず、明示的な変換が要る。Cも正しく、BigInt同士の除算は整数結果となり小数部を切り捨てる。Bは結果の型と小数部の扱いを逆に説明している。Dについて、Mathの演算はNumber向けでありBigIntをそのまま処理するものではない。
2. オブジェクト、関数、クラス
問15. 正解:D
Dはオブジェクトリテラル内の計算プロパティ名を使い、fieldNameの値をキーにしながら固定キーも定義できる。AのObject.create第1引数はプロトタイプであり、文字列キー指定ではない。BはfieldNameという固定名になり、通常のオブジェクトにprototypeを足しても要件と異なる。CのObjectコンストラクターは複数のキーと値をその形で受け取らない。
問16. 正解:D
Dのブラケット記法はハイフンを含む文字列キーにも、変数で動的に与えるキーにも利用できる。Aのobject.panel-sizeは減算式として解釈され、目的のプロパティ参照にならない。Bはobjectを関数として呼ぶ構文である。Cのドット記法は文字どおりkeyという名前を参照し、変数keyの内容を展開しない。
問17. 正解:D
Dは角括弧内の式を評価してプロパティ名にする計算プロパティ名であり、localeの値"ja"をキーにできる。Aはlocaleという固定文字列をキーにする。Bのドットを含むその位置の構文は無効である。Cはメソッド定義の構文とも一致せず、変数値をキーとして文字列値を設定する要件を満たさない。
問18. 正解:C
CのObject.hasOwnは指定名が対象オブジェクト自身のプロパティである場合だけ真を返すため、継承プロパティを除外できる。Aのin演算子はプロトタイプチェーン上のプロパティも検出する。Bは値がundefinedかどうかの確認で所有関係を判定できない。Dはプロトタイプ側の列挙可能キーを調べており、order自身の所有を検査していない。
問19. 正解:C
CのとおりObject.keysは、対象オブジェクト自身が持つ列挙可能な文字列キーを配列で返す。Aの継承プロパティと列挙不可プロパティは対象外である。Bは自身と継承元を混在させ、さらにSymbolキーも含めている点が誤りである。Dのconfigurable属性は列挙対象かどうかを決めず、enumerable属性が基準になる。
問20. 正解:B
BのObject.entriesは自身の列挙可能な文字列キープロパティを[key, value]の組として返すため、分割代入を使って反復できる。AのObject.keysはキーだけを返す。CのObject.valuesは値だけであり、説明が逆である。DのObject.getPrototypeOfはプロトタイプを返すメソッドで、プロパティの組を列挙しない。
問21. 正解:C
Cが各属性の役割を正しく対応させる。writableはデータプロパティの値を書き換えられるか、enumerableは列挙処理に現れるか、configurableは記述子の変更や削除を許すかに関わる。AとBは属性の意味を入れ替えている。Dも読取可否を直接決める属性ではなく、falseの組み合わせでも通常は値を読み取れる。
問22. 正解:A、D
AとDが要件を満たす。writable:trueで値の更新を許可し、enumerable:falseでObject.keysなどの列挙から除外し、configurable:falseで削除や原則的な再定義を禁止する。Bはenumerable:trueにすると列挙対象になるため逆である。Cもconfigurable:trueは削除や記述子変更を許す方向なので、禁止要件に反する。
問23. 正解:A
Aが正しい。getterはgetの後にプロパティー名と引数なしの関数本体を記述する。getterは引数を取れないためBは無効で、CとDもgetter構文ではない。
問24. 正解:A
Aのとおりスプレッド構文は外側を新しくするシャローコピーで、addressのような入れ子のオブジェクト参照は元とコピーで共有される。Bと異なり外側のcopy自体は別オブジェクトである。Cのconstは変数への再代入を防ぐだけで深い不変性を与えない。Dは文字列ではなくaddressオブジェクトの共有参照が原因である。
問25. 正解:B、C
Bは名前付きの短縮メソッド定義、Cは算出プロパティ名を用いたメソッド定義で、どちらも有効である。Aは呼び出し可能ではあるが、アロー関数をデータプロパティの値へ代入する形で、ここで問うメソッド定義構文ではない。Dはfunction宣言をその位置へ直接置く構文になっており、オブジェクト初期化子として構文エラーになる。
問26. 正解:C
Cが正しく、通常関数のthisは呼び出し方によって決まり、callは第1引数をその呼び出しのthisとして指定する。Aの定義場所だけでは通常関数のthisは固定されない。Bは一度のメソッド呼び出しが後続へ束縛を残すという誤解である。Dの字句的thisはアロー関数の特徴で、通常関数には当てはまらない。
問27. 正解:B
Bのとおり、通常のメソッド呼び出しではthisはメソッドへアクセスした受け取り側のaccountになる。Aはコンストラクターとprototypeの関係を混同している。Cのソースファイル名がthisへ自動設定されることはない。Dの引数はargumentsなどで扱われ、thisと同じ値にはならない。
問28. 正解:D
Dならアロー関数は自身のthisを持たず、外側の通常メソッドが受け取ったthisを字句的に参照する。Aの通常関数は呼び出し方により別のthisとなり得る。Bのnewはコンストラクター呼び出しで目的が異なる。Cは外側メソッドまでアロー関数にすると、メソッド呼び出しの受け取り側をthisとして得られなくなる。
問29. 正解:C
Cは両メソッドの引数形式の違いを正しく表す。どちらも関数を直ちに呼び出すためAの同期・非同期の区別はない。Bで新しい束縛済み関数を返すのはbindであり、callやapplyは元関数を書き換えない。Dのようなクラスとアロー関数による用途分担もなく、一般の呼び出し可能な関数で利用する。
3. ブラウザとイベント
問30. 正解:A
AのとおりDOMは文書をノードの論理的なツリーとして表し、要素ノードやテキストノードが親子関係を形成する。Bは階層構造を無視している。CはテキストもTextノードとして表現されるため誤りである。Dは祖先を共有する場合はあっても、すべてのノードが同じ直接の親を持つわけではない。
問31. 正解:C
CのquerySelectorAllは指定したセレクターに一致する要素をすべて含むNodeListを返す。AのgetElementByIdはID文字列による単一要素の検索で、CSSセレクター用ではない。BのquerySelectorは最初に一致した1要素だけを返す。DのcreateElementは新しい要素を生成するメソッドで、既存要素の検索を行わない。
問32. 正解:B
BのgetElementByIdはID文字列に一致する要素を直接返す。Aはクラス名を対象にHTMLCollectionを返すため目的が違う。Cは指定したタグ名の新規要素を作るだけで既存要素を検索しない。DはCSSセレクターとして解釈し、先頭に#もないためorder-summaryという要素名を検索するうえ、複数結果用である。
問33. 正解:A
Aが適切で、タグに対応するpはElementノード、要素内の文字データは子のTextノードとして表される。BのDocumentノードは文書全体を表すため両者の型ではない。Cは属性と要素内容のテキストを混同している。Dはノードの種類と親子関係を逆にしており、文字列が要素ノードになるわけではない。
問34. 正解:C
CはcreateElementでliのElementノードを生成し、createTextNodeで表示文字列のTextノードを生成して親子にできる。Aはテキストノードしか作らずli要素にならない。BのquerySelectorは既存要素の検索でテキスト生成をしない。DのgetElementByIdも検索用であり、removeはノードを削除する操作なので追加要件に反する。
問35. 正解:B
Bが相違点を正しく表す。appendは複数のNodeや文字列を引数にでき、文字列はTextノードとして追加される。一方appendChildは1回に1つのNodeを追加する。Aはappendの戻り値がundefinedであるため誤り。CはappendChildが文字列を直接受け取らない。Dはどちらも通常は親の末尾へ追加するため挿入位置の説明が違う。
問36. 正解:A、B
該当する選択肢はA「
parent.replaceChild(newNode, oldNode)の順で呼び出す。」、B「戻り値は置き換えられたoldNodeである。」である。公式資料を読むと、この条件で成立する標準動作を本文から確認できる。C「oldNode.replaceChild(parent, newNode)の順で呼び出す。」、D「戻り値は常にundefinedである。」は別機能の説明を混ぜるか、実在しないメソッドを用いている。
問37. 正解:A
A「属性があれば文字列を返し、存在しなければ
nullを返す。」が正しい。日本語の公式本文では、対象APIの引数、返値、実行時の振る舞いが明記されている。対してB「属性がなければ空配列を返す。」、C「属性があれば必ず真偽値を返す。」、D「属性を読み取ると同時に削除する。」は別APIとの混同、引数順の誤り、または存在しない構文であり、要件を満たさない。
問38. 正解:A
AのclassList.toggleは指定クラスの有無を切り替えるため、追加と削除の分岐を1回の呼び出しで表せる。BのclassNameは文字列でありaddメソッドを持たない。Cのstyleはインラインスタイル宣言を扱い、CSSクラスのtoggleは提供しない。DのgetAttributeは属性値を読むだけで、クラスを変更する効果がない。
問39. 正解:C
CのgetComputedStyleは、スタイルシート、継承、カスケードなどを反映して計算されたスタイル宣言を返すため、実際のcolorを取得できる。Aとelement.styleが扱うのは主にインラインstyle属性で、空なら外部規則の結果を得られない。Bにその形式の標準メソッドはない。DのclassListはクラス名の集合で、計算済みのCSS値を持たない。
4. デバッグとエラーハンドリング
問40. 正解:A、C
AとCが適切である。SyntaxErrorはJavaScriptの構文規則に合わないコードを解析した際に発生し、読み込み時の解析に失敗すれば通常の文の実行へ進めない。Bのような括弧の自動補完は行われない。DのReferenceErrorは無効な参照に対する別種のエラーであり、構文不正の分類を置き換えない。
問41. 正解:B
BのReferenceErrorは、現在のスコープチェーンに存在しない識別子を参照したときのエラーである。AのRangeErrorは値が許容範囲外の場合に用いる。Cはコードの文法自体が不正な場合で、正しい構文内の未宣言名とは異なる。DのTypeErrorは値や型に対して不適切な操作をした場合である。
問42. 正解:C
Cが適切である。customerという変数自体は存在しても、その値nullにはnameプロパティを読み取る操作を適用できないためTypeErrorになる。Aは数値などの許容範囲に関するエラーである。Bは構文不正の場合に発生する。DのReferenceErrorは識別子の束縛が見つからない場合であり、宣言済みで値がnullのケースとは違う。
問43. 正解:C
Cが適切で、toFixedへ許容範囲を外れた桁数を渡すとRangeErrorになる。Aは数値のtoFixedが文字列を返す正常なメソッドであることを無視している。Bは呼び出し構文自体が正しいため当たらない。DもtoFixedは数値オブジェクトのメソッドとして解決されるため、グローバル識別子の未解決ではない。
5. 非同期プログラミング
問44. 正解:C
CはPromiseの履行後に後続処理を登録するため、取得結果が届いた後に表示できる。Aは順序をさらに早めるだけである。Bは同じ処理を反復し、完了通知の順序を保証しない。Dは未決定のPromise自体を文字列化するだけで、非同期処理の完了を待つことにはならない。
問45. 正解:B
Bのコールバックは別の関数へ渡され、イベント発生や非同期操作の完了後に呼び出される処理を表す。Aの変数複製はコールバックの目的ではない。Cは関数を渡してもJavaScriptエンジンのスレッドを増やさない。Dも誤りで、コールバックは完了後の処理を指定するが呼び出し全体を同期化しない。
問46. 正解:A
Aは非同期処理をPromiseとして連鎖させ、深い入れ子を平坦化しつつ拒否をcatchへ集約できる。Bは関数名を揃えても制御構造の入れ子と分散したエラー処理を解消しない。Cは処理を重複起動したりイベントループを妨げたりする。Dは共有状態を増やすだけで、実行順序や完了条件を明示できない。
問47. 正解:D
Dのイベントループは実行スタックの状態を見ながら、待機しているジョブやタスクを実行へ進める仕組みである。AはJavaScriptの基本的な単一スレッド実行モデルと異なる。Bは実行中の同期処理へコールバックを割り込ませない。Cの型検査はイベントループの役割ではなく、JavaScriptは動的型付けで動作する。
問48. 正解:D
Dが正しい。setTimeoutの遅延0は即時の割り込みを意味せず、コールバックはタスクとしてキューへ入り、現在のタスクと実行スタック上の同期処理が完了した後に実行される。Aは同期処理への割り込みを誤っている。Bはタイマーのコールバックをマイクロタスクと混同している。Cも同時実行を保証する仕組みではない。
問49. 正解:B
Bが適切で、解決済みPromiseのthen反応はマイクロタスクとして現在のタスク終了後に処理され、次のsetTimeoutタスクへ進む前にマイクロタスクキューが排出される。Aは同期処理への割り込みを誤る。Cは同時実行ではない。DもPromise反応はloadイベントを待つ規則ではなく、現在の実行コンテキスト後に処理される。
問50. 正解:B
Bが正しい。Promiseのthen反応はマイクロタスクとして登録され、現在の同期処理が終わると、次のタイマータスクへ進む前に処理される。Aはタスクとマイクロタスクの優先順を逆にしている。Cは登録時にハンドラー本体が同期実行されるわけではない。Dもイベントの手動送出は不要で、各キューの規則に従って実行される。
問51. 正解:A
AのqueueMicrotaskは関数をマイクロタスクキューへ追加し、現在のタスク終了後かつイベントループが次のタスクへ進む前に実行させる。BのsetIntervalはタイマーのタスクを反復登録する。CのrequestAnimationFrameは次回描画前のコールバックで同期実行ではない。DのdispatchEventはEventオブジェクトを配送するAPIで、関数をそのままマイクロタスク化しない。
6. サーバーサイド JavaScript
問52. 正解:A
AのNode.jsはブラウザー外で動くJavaScriptランタイムであり、サーバー側のファイル処理に適する。BのDOMは文書操作用で、サーバー実行基盤ではない。CのWeb Storageはブラウザーのオリジン単位の保存領域である。DのService Workerもブラウザーのライフサイクルに従うため、独立した夜間バッチには向かない。
問53. 正解:A
AのglobalThisは実行環境をまたいでグローバルなthis値へアクセスする標準的な手段である。BのNode.jsにはブラウザーのwindowが前提として存在しない。CのdocumentもDOMを提供するブラウザー側のAPIであり、代入して環境機能を得られるわけではない。Dは宣言方法を変えてもwindowオブジェクトを生成しない。
問54. 正解:B
Bが正しい。Node.jsは非同期でイベント駆動型のJavaScriptランタイムで、ネットワークアプリケーションや開発ツールに利用できる。AはDOM専用でもマークアップ言語でもない。CはApex変換器ではない。DはJavaScriptを実行する基盤でありCSS専用ではない。
問55. 正解:A
Aが正しい。JavaScriptランタイムではスタック上の同期ロジックが完了して制御を返すまで同じスレッドを保持し、待機中の処理は順番を待つ。Bは自動並列化を仮定している。Cでキューが削除されることはない。Dも同期処理を途中で破棄する仕組みではない。
問56. 正解:D
DはECMAScriptモジュールの名前付きインポートである。Aは再エクスポートの構文で、main.js内へローカルのaddバインディングを作る目的とは異なる。Bは標準のモジュール読込APIではない。Cはmodule.exportsを関数として呼び出す誤った構文である。
7. テスト
問57. 正解:C
要件を満たすのはC「外部依存をモックし、税額計算の入力と戻り値を小さな単位で検証する。」である。根拠本文は、選択肢の条件に対応する標準動作が示されている。一方、A「画面からデータベースまで常に全体を起動する。」、B「本番APIの障害も計算関数の合否に含める。」、D「アサーションを削除して通信成功だけを見る。」は処理時点、引数、結果の説明が本文と一致しない。
問58. 正解:D
D「
[2, 4, 6].every(n => n % 2 === 0)」が正しい。日本語の公式本文では、対象APIの引数、返値、実行時の振る舞いが明記されている。対してA「[2, 4, 6].some(n => n % 2 === 0)は全要素を保証する。」、B「[2, 4, 6].filter(Boolean) === true」、C「[2, 4, 6].map(n => n % 2)は真偽値を返す。」は別APIとの混同、引数順の誤り、または存在しない構文であり、要件を満たさない。
問59. 正解:D
D「
structuredClone(data)を使う。」を選ぶ。公式日本語リファレンスによると、中心となるメソッドや構文の動作を確認できる。A「copy = dataと代入する。」、B「トップレベルの参照をそのまま再利用する。」、C「元データを各テストで直接変更する。」は似た機能の役割を取り違えるか、標準仕様にない呼び出しを示している。
問60. 正解:C、D
該当する選択肢はC「
Number.isNaN(NaN)はtrueを返す。」、D「Number.isNaN('NaN')はfalseを返す。」である。公式資料を読むと、この条件で成立する標準動作を本文から確認できる。A「グローバルisNaN()は引数を型変換せず判定する。」、B「NaN === NaNはtrueになる。」は別機能の説明を混ぜるか、実在しないメソッドを用いている。
この先の演習量を確保するために
ここまでの60問と同じ密度の解説が、全500問すべてに付いた問題集を販売しています。本記事の60問も、この500問の中に含まれています(残りの440問は本記事には入っていません)。
免責事項
- 非公式のオリジナル教材です:本記事の模擬問題・解説はすべて当研究所が独自に作成したものであり、実際の試験問題の複製・転載・流用ではありません。Salesforce, Inc.が提供・監修・承認したものではなく、同社と提携・協賛等の関係もありません。Salesforce、Trailhead等の名称・ロゴはSalesforce, Inc.の商標または登録商標です。
- 公式情報との相違の可能性:実際の試験の出題内容・出題形式・出題比率・難易度・合格ライン・受験料等は、Salesforce社の判断により予告なく変更されることがあります。当研究所は適宜、内容の点検を行っていますが、本記事が常に最新の公式試験ガイドと完全に一致することを保証するものではありません。受験前に必ず公式試験ガイド(Trailhead/Salesforce公式サイト)で最新情報をご確認ください。
- 対応バージョンについて:本記事の問題は作成時点の公式情報を参照しており、公式試験ガイド(日本語版)に明記された対応バージョンと差異がある場合があります。
- 合格・成果の保証はありません:本記事は学習の補助を目的としたものであり、内容を利用したことによる資格試験の合格・特定のスコア取得その他の成果を保証するものではありません。
- 正確性についての留意:内容の正確性については作成時点および見直し時点で可能な限りの確認を行っていますが、誤字脱字・解説内容の誤り等が皆無であることを保証するものではありません。お気づきの点はコメント欄にてお知らせください。確認のうえ無料で修正します。
- 損害についての免責:本記事の内容を利用したことにより生じたいかなる損害(学習時間の損失、受験結果に関するものを含みますがこれに限りません)についても、当研究所は責任を負いかねます。あらかじめご了承のうえご利用ください。
- 著作権・利用範囲:本記事の全文の著作権は当研究所に帰属します。読者ご本人が学習目的でご利用いただく範囲を超えて、内容の複製・転載・再配布・第三者への共有・譲渡・転売等を行うことは禁止します。