fact-check について
fact-checkは、JavaScriptの概念ドキュメントの技術的な正確さを確認するスキルです。コード例、MDNや仕様への参照、外部リソース、本文中の技術的な主張を確認する手順を示します。
主な機能
- 01コードの出力と動作の検証
- 02MDNリンクとAPI記述の確認
- 03ECMAScript仕様との照合
- 04外部学習リソースのレビュー
- 05技術的主張と誤解の監査
活用シーン
- 01公開前の新しい概念ページのレビュー
- 02大幅な編集後の正確性確認
- 03コミュニティからの投稿の監査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ leonardomso/ 33-js-concepts --skill fact-checkインストール後、Claude Code で/fact-checkを入力して読み込まれたか確認します。
詳細
スキル:JavaScript ファクトチェッカー
このスキルを使用して、33 JavaScript Concepts プロジェクトの概念ドキュメントページの技術的な正確性を検証します。これにより、JavaScript に関する誤情報の拡散を防ぎます。
使用するタイミング
- 新しい概念ページを公開する前
- 既存のコンテンツに大幅な編集を加えた後
- コミュニティからのコントリビューションをレビューするとき
- 新しい JavaScript 機能に合わせてページを更新するとき
- 既存コンテンツの定期的な正確性監査
防止する問題
- JavaScript の動作に関する誤った主張
- 古い情報(ES6 以前のパターンを現在も使われているものとして紹介するなど)
- 記載された出力が得られないコード例
- 壊れている、または誤解を招く外部リソースへのリンク
- よくある誤解を事実として述べること
- ブラウザー固有の動作を普遍的なものとして紹介すること
- 不正確な API の説明
ファクトチェックの方法
完全なファクトチェックを行うには、次の5つのフェーズを順番に実施してください。
フェーズ 1:コード例の検証
概念ページに含まれるすべてのコード例の正確性を検証する必要があります。
手順
-
ドキュメント内のすべてのコードブロックを特定します
-
コードブロックごとに:
- コードと出力コメント(例:
// "string")を読みます - コードを頭の中で実行するか、JavaScript 環境でテストします
- 出力がコメントの記載と一致することを確認します
- 変数名とロジックが正しいことを確認します
- コードと出力コメント(例:
-
「誤り」の例(❌ のマークがあるもの)について:
- 実際に誤った動作や予期しない動作が起きることを確認します
- 誤りである理由の説明が正確であることを確認します
-
「正しい」例(✓ のマークがあるもの)について:
- 記載どおりに動作することを確認します
- 現在のベストプラクティスに従っていることを確認します
-
プロジェクトのテストを実行します:
# Run all tests npm test # Run tests for a specific concept npm test -- tests/fundamentals/call-stack/ npm test -- tests/fundamentals/primitive-types/ -
テストカバレッジを確認します:
/tests/{category}/{concept-name}/を確認します- 主要なコード例を対象にしたテストがあることを確認します
- テストカバレッジのない例にフラグを立てます
コード検証チェックリスト
| 確認項目 | 確認方法 |
|---|---|
console.log の出力がコメントと一致している | コードを実行するか、頭の中で追跡する |
| 変数の名前と使い方が正しい | ロジックを読み通す |
| 関数が期待される値を返す | 実行の流れを追う |
| 非同期コードが記載された順序で解決される | イベントループを理解する |
| エラーの例で実際に例外がスローされる | try/catch でテストする |
| 配列/オブジェクトのメソッドが正しい型を返す | MDN で確認する |
typeof の結果が正確である | よく使われるケースをテストする |
| 関連する場合、厳格モードでの動作に触れている | 例が厳格モードに依存するか確認する |
よくある出力の誤り
// Watch for these common mistakes:
// 1. typeof null
typeof null // "object" (not "null"!)
// 2. Array methods that return new arrays vs mutate
const arr = [1, 2, 3]
arr.push(4) // Returns 4 (length), not the array!
arr.map(x => x*2) // Returns NEW array, doesn't mutate
// 3. Promise resolution order
Promise.resolve().then(() => console.log('micro'))
setTimeout(() => console.log('macro'), 0)
console.log('sync')
// Output: sync, micro, macro (NOT sync, macro, micro)
// 4. Comparison results
[] == false // true
[] === false // false
![] // false (empty array is truthy!)
// 5. this binding
const obj = {
name: 'Alice',
greet: () => console.log(this.name) // undefined! Arrow has no this
}
フェーズ 2:MDN ドキュメントの検証
JavaScript の API、メソッド、動作に関する主張は、すべて MDN のドキュメントに沿っている必要があります。
手順
-
すべての MDN リンクを確認します:
- ドキュメント内の MDN リンクをすべて開きます
- リンクが 404 ではなく 200 を返すことを確認します
- リンク先のページが、参照している内容に一致していることを確認します
-
API の説明を検証します:
- メソッドのシグネチャを MDN と比較します
- パラメーター名と型を確認します
- 戻り値の型を確認します
- エッジケースでの動作を確認します
-
非推奨の API を確認します:
- MDN の非推奨警告を確認します
- 非推奨のメソッドを現行のものとして教えている場合は、フラグを立てます
-
ブラウザー互換性に関する主張を検証します:
- MDN の互換性テーブルと照合します
- より広範なサポート状況について Can I Use を確認します
MDN リンクのパターン
| コンテンツの種類 | MDN URL のパターン |
|---|---|
| Web API | https://developer.mozilla.org/en-US/docs/Web/API/{APIName} |
| グローバルオブジェクト | https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/{Object} |
| 文 | https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/{Statement} |
| 演算子 | https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/{Operator} |
| HTTP | https://developer.mozilla.org/en-US/docs/Web/HTTP |
MDN で確認すべき項目
| 主張の種類 | 確認する内容 |
|---|---|
| メソッドのシグネチャ | パラメーター、省略可能なパラメーター、戻り値の型 |
| 戻り値 | 正確な型と取りうる値 |
| 副作用 | 変更を加えるか? 何に影響するか? |
| 例外 | どのようなエラーが発生する可能性があるか? |
| ブラウザーのサポート状況 | 互換性テーブル |
| 非推奨の状況 | 非推奨を示す警告があるか? |
フェーズ 3:ECMAScript 仕様への準拠
JavaScript の細かな動作を確認するには、ECMAScript 仕様で検証します。
仕様を確認すべき場合
- 境界ケースや通常とは異なる動作
- 「JavaScript の内部での動作」に関する主張
- 型変換のルール
- 演算子の優先順位
- 実行順序の保証
- 「常に」「決して」「保証される」といった言葉を含む主張
仕様の参照方法
ECMAScript 仕様はこちらです:https://tc39.es/ecma262/
| 概念 | 仕様のセクション |
|---|---|
| 型変換 | Abstract Operations(7.1) |
| 等価性 | Abstract Equality Comparison(7.2.14)、Strict Equality(7.2.15) |
| typeof | The typeof Operator(13.5.3) |
| オブジェクト | Ordinary and Exotic Objects' Behaviours(10) |
| 関数 | ECMAScript Function Objects(10.2) |
| this のバインディング | ResolveThisBinding(9.4.4) |
| Promise | Promise Objects(27.2) |
| イテレーション | Iteration(27.1) |
仕様による検証例
// Claim: "typeof null returns 'object' due to a bug"
// Spec says: typeof null → "object" (Table 41)
// Historical context: This is a known quirk from JS 1.0
// Verdict: ✓ Correct, though calling it a "bug" is slightly informal
// Claim: "Promises always resolve asynchronously"
// Spec says: Promise reaction jobs are enqueued (27.2.1.3.2)
// Verdict: ✓ Correct - even resolved promises schedule microtasks
// Claim: "=== is faster than =="
// Spec says: Nothing about performance
// Verdict: ⚠️ Needs nuance - this is implementation-dependent
フェーズ 4:外部リソースの検証
記事、動画、コースなど、すべての外部リンクを検証する必要があります。
手順
-
リンクにアクセスできるか確認する:
- 各外部リンクをクリックします
- ページが読み込まれることを確認します(404 や有料限定ではないこと)
- 別の URL へのリダイレクトがあれば記録します
-
コンテンツの正確性を確認する:
- リソースをざっと読み、明らかな誤りがないか確認します
- JavaScript が中心の内容であることを確認します(C#、Python、Java ではないこと)
- アンチパターンを教えていないことを確認します
-
公開日を確認する:
- 非同期処理やモジュールなど、時間の影響を受けやすいトピックでは、最近のコンテンツを優先します
- ES6 以降のトピックについては、2015 年以前のリソースにフラグを付けます
-
説明の正確性を確認する:
- 説明はリソースで実際に扱われている内容と一致していますか?
- 説明は具体的ですか(一般的な説明ではありませんか)?
外部リソースのチェックリスト
| 確認項目 | 合格基準 |
|---|---|
| リンクが機能する | 200 を返し、コンテンツが読み込まれる |
| 有料限定ではない | 無料でアクセスできる(または、有料であることが明記されている) |
| JavaScript が中心 | 主に他の言語を扱う内容ではない |
| 古くない | 最新の JS トピックでは 2015 年以降 |
| 説明が正確 | 説明が実際の内容と一致する |
| アンチパターンがない | 悪い慣行を教えていない |
| 信頼できる提供元 | 著名で信頼できる作成者による |
外部リソースに見られる注意すべき兆候
- ES6 以降のトピックで
varをあらゆる場面で使用している - Promise や非同期処理に関するコンテンツでコールバックを使用している
- 最新の DOM 操作方法として jQuery を教えている
- JavaScript に関する事実誤認が含まれている
- タイムスタンプへのリンクがない 2 時間を超える動画
- 主に別の言語を扱うコンテンツ
- 非推奨であることに触れずに非推奨 API を使用している
フェーズ 5:技術的な主張の監査
JavaScript の動作に関する説明文の主張をすべて確認します。
検証が必要な主張
| 主張の種類 | 検証方法 |
|---|---|
| パフォーマンスに関する主張 | ベンチマークまたは注意書きが必要 |
| ブラウザーの動作 | 対象ブラウザーを明記し、MDN で確認する |
| 歴史に関する主張 | 日付やバージョンを確認する |
| 「常に」または「決して」という表現 | 例外がないか確認する |
| 比較(X と Y) | 双方が正確に説明されているか確認する |
技術的な主張に見られる注意すべき兆候
- 例外に触れずに「常に」または「決して」と述べている
- ベンチマークのないパフォーマンスに関する主張
- 対象ブラウザーを明記していないブラウザーの動作に関する主張
- 違いを単純化しすぎた比較
- 日付のない歴史に関する主張
- 仕様への参照がない「JavaScript の動作」に関する主張
検証すべき主張の例
❌ "async/await is always better than Promises"
→ Verify: Not always - Promise.all() is better for parallel operations
❌ "JavaScript is an interpreted language"
→ Verify: Modern JS engines use JIT compilation
❌ "Objects are passed by reference"
→ Verify: Technically "passed by sharing" - the reference is passed by value
❌ "=== is faster than =="
→ Verify: Implementation-dependent, not guaranteed by spec
✓ "JavaScript is single-threaded"
→ Verify: Correct for the main thread (Web Workers are separate)
✓ "Promises always resolve asynchronously"
→ Verify: Correct per ECMAScript spec
JavaScript に関するよくある誤解
以下の誤解が事実として述べられていないか注意してください。
型システムに関する誤解
| 誤解 | 実際のところ | 確認方法 |
|---|---|---|
typeof null === "object" は意図された仕様である | 互換性のために修正できない、JS 1.0 由来のバグです | 歴史的背景、TC39 の議論 |
| JavaScript には型がない | JS は動的型付けであり、型がないわけではありません | ECMAScript 仕様で型が定義されています |
== は常に間違いである | == null は null と undefined の両方をチェックするため、正当な用途があります | 多くのスタイルガイドでこのパターンが認められています |
NaN === NaN が false なのは「間違い」 | IEEE 754 浮動小数点仕様に基づく意図的な仕様です | IEEE 754 標準 |
関数に関する誤解
| 誤解 | 実際のところ | 確認方法 |
|---|---|---|
| アロー関数は単に短い構文である | this、arguments、super、new.target を持ちません | MDN、ECMAScript 仕様 |
var は値とともに関数スコープに巻き上げられる | 巻き上げられるのは宣言だけで、初期化はされません | コードで確認、MDN |
| クロージャは特別なオプトイン機能である | JS のすべての関数はクロージャです | ECMAScript 仕様 |
| IIFE は時代遅れである | 一度だけの初期化に今でも役立ちます | 現代のコードベースでも使用されています |
非同期処理に関する誤解
| 誤解 | 実際のところ | 確認方法 |
|---|---|---|
| Promise は並列で実行される | JS はシングルスレッドです。Promise は非同期ですが、並列ではありません | イベントループの説明 |
async/await は Promise とは異なる | Promise を基にしたシンタックスシュガーです | MDN、あらゆる thenable を await できます |
setTimeout(fn, 0) はすぐに実行される | 現在の実行とマイクロタスクの後に実行されます | イベントループ、コードで確認 |
await はプログラム全体を一時停止する | 一時停止するのは非同期関数だけで、イベントループは停止しません | コードで確認 |
オブジェクトに関する誤解
| 誤解 | 実際のところ | 確認方法 |
|---|---|---|
| オブジェクトは「参照渡し」される | 参照は値渡しされます(「共有渡し」) | 再代入テスト |
const はオブジェクトを不変にする | const が防ぐのは再代入であり、変更ではありません | コードで確認 |
| JavaScript のすべてはオブジェクトである | プリミティブはオブジェクトではありません(ラッパーはあります) | typeof テスト、MDN |
Object.freeze() はディープな不変性を作る | シャローなため、ネストされたオブジェクトは変更できます | コードで確認 |
パフォーマンスに関する誤解
| 誤解 | 実際のところ | 確認方法 |
|---|---|---|
=== は常に == より高速である | 実装に依存し、仕様で保証されていません | ベンチマークの結果は異なります |
for ループは forEach より高速である | 現代のエンジンは両方を最適化します。用途によって異なります | ベンチマーク |
| アロー関数は高速である | パフォーマンスに差はなく、動作が異なるだけです | ベンチマーク |
| DOM 操作を避ければ常に高速である | 個別に行うより、一括変更のほうが遅い場合があります | ブラウザーや用途によって異なります |
テストの統合
プロジェクトのテストスイートを実行することは、事実確認の重要な一環です。
テストコマンド
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
# Run tests for specific concept
npm test -- tests/fundamentals/call-stack/
npm test -- tests/fundamentals/primitive-types/
npm test -- tests/fundamentals/value-reference-types/
npm test -- tests/fundamentals/type-coercion/
npm test -- tests/fundamentals/equality-operators/
npm test -- tests/fundamentals/scope-and-closures/
テストディレクトリ構造
tests/
├── fundamentals/ # Concepts 1-6
│ ├── call-stack/
│ ├── primitive-types/
│ ├── value-reference-types/
│ ├── type-coercion/
│ ├── equality-operators/
│ └── scope-and-closures/
├── functions-execution/ # Concepts 7-8
│ ├── event-loop/
│ └── iife-modules/
└── web-platform/ # Concepts 9-10
├── dom/
└── http-fetch/
テストがない場合
ある概念にテストがない場合:
- レポートで「テストカバレッジが必要」として指摘します
- コード例が正しいことを手動で確認します
- 後続タスクとしてテストの追加を検討します
検証リソース
一次情報源
| リソース | URL | 用途 |
|---|---|---|
| MDN Web Docs | https://developer.mozilla.org | API ドキュメント、ガイド、互換性 |
| ECMAScript 仕様 | https://tc39.es/ecma262 | 権威ある動作仕様 |
| TC39 提案 | https://github.com/tc39/proposals | 新機能、ステージ |
| Can I Use | https://caniuse.com | ブラウザー互換性 |
| Node.js ドキュメント | https://nodejs.org/docs | Node 固有の API |
| V8 ブログ | https://v8.dev/blog | エンジンの内部構造 |
プロジェクトのリソース
| リソース | パス | 用途 |
|---|---|---|
| テストスイート | /tests/ | コード例の検証 |
| 概念のページ | /docs/concepts/ | 現在のコンテンツ |
| テストの実行 | npm test | すべてのテストを実行 |
ファクトチェックレポートのテンプレート
このテンプレートを使用して、調査結果を記録してください。
# Fact Check Report: [Concept Name]
**File:** `/docs/concepts/[slug].mdx`
**Date:** YYYY-MM-DD
**Reviewer:** [Name/Claude]
**Overall Status:** ✅ Verified | ⚠️ Minor Issues | ❌ Major Issues
---
## Executive Summary
[2-3 sentence summary of findings. State whether the page is accurate overall and highlight any critical issues.]
**Tests Run:** Yes/No
**Test Results:** X passing, Y failing
**External Links Checked:** X/Y valid
---
## Phase 1: Code Example Verification
| # | Description | Line | Status | Notes |
|---|-------------|------|--------|-------|
| 1 | [Brief description] | XX | ✅/⚠️/❌ | [Notes] |
| 2 | [Brief description] | XX | ✅/⚠️/❌ | [Notes] |
| 3 | [Brief description] | XX | ✅/⚠️/❌ | [Notes] |
### Code Issues Found
#### Issue 1: [Title]
**Location:** Line XX
**Severity:** Critical/Major/Minor
**Current Code:**
```javascript
// The problematic code
問題点: [問題の説明] 修正後のコード:
// The corrected code
フェーズ 2:MDN/仕様の検証
| 主張 | 場所 | 出典 | ステータス | 備考 |
|---|---|---|---|---|
| [主張の内容] | XX 行目 | MDN/仕様 | ✅/⚠️/❌ | [備考] |
MDN リンクのステータス
| リンクテキスト | URL | ステータス |
|---|---|---|
| [テキスト] | [URL] | ✅ 200 / ❌ 404 |
仕様との相違点
[ECMAScript 仕様と一致しない主張がある場合は、ここに詳しく記載してください]
フェーズ 3:外部リソースの検証
| リソース | 種類 | リンク | 内容 | 備考 |
|---|---|---|---|---|
| [タイトル] | 記事/動画 | ✅/❌ | ✅/⚠️/❌ | [備考] |
リンク切れ
- XX 行目: [URL] - 404 Not Found
- YY 行目: [URL] - ドメインの有効期限切れ
内容に関する懸念
- [リソース名]: [懸念点 — 例:古い情報、誤った言語、アンチパターン]
説明の正確性
| リソース | 説明は正確ですか? | 備考 |
|---|---|---|
| [タイトル] | ✅/❌ | [備考] |
フェーズ 4:技術的な主張の監査
| 主張 | 場所 | 判定 | 備考 |
|---|---|---|---|
| "[主張]" | XX 行目 | ✅/⚠️/❌ | [備考] |
修正が必要な主張
- XX 行目: "[現在の主張]"
- 問題点: [何が誤っているか]
- 修正案: "[修正後の主張]"
フェーズ 5:テスト結果
テストファイル: /tests/[category]/[concept]/[concept].test.js
実行したテスト: XX
合格: XX
失敗: XX
失敗したテスト
| テスト名 | 期待値 | 実際の値 | 関連するドキュメントの行 |
|---|---|---|---|
| [テスト] | [期待値] | [実際の値] | XX 行目 |
カバレッジの不足
テストに対応するものがないドキュメント内の例:
- XX 行目:[テストされていない例の説明]
- YY 行目:[テストされていない例の説明]
問題の概要
重大(公開前に必ず修正)
- [問題のタイトル]
- 場所:XX 行目
- 問題点:[説明]
- 修正方法:[修正方法]
主要(修正を推奨)
- [問題のタイトル]
- 場所:XX 行目
- 問題点:[説明]
- 修正方法:[修正方法]
軽微(改善できるとよい)
- [問題のタイトル]
- 場所:XX 行目
- 提案:[改善案]
推奨事項
- [優先度 1]: [具体的で実行可能な推奨事項]
- [優先度 2]: [具体的で実行可能な推奨事項]
- [優先度 3]: [具体的で実行可能な推奨事項]
検証チェックリスト
- すべてのコード例で、出力が正しいことを確認済み
- すべての MDN リンクを確認し、有効であることを確認済み
- API の説明が MDN のドキュメントと一致
- ECMAScript への準拠を確認済み(該当する場合)
- すべての外部リソースへのリンクにアクセス可能
- リソースの説明が内容を正確に表している
- JavaScript に関するよくある誤解がない
- 技術的な主張が正確で、適切なニュアンスを備えている
- プロジェクトのテストを実行し、結果を確認済み
- レポートが完成し、引き継ぎの準備ができている
承認
検証者: [名前/Claude] 日付: YYYY-MM-DD 推奨事項: ✅ 公開準備完了 | ⚠️ 先に問題を修正 | ❌ 大幅な修正が必要
---
## Quick Reference: Verification Commands
```bash
# Run all tests
npm test
# Run specific concept tests
npm test -- tests/fundamentals/call-stack/
# Check for broken links (if you have a link checker)
# Install: npm install -g broken-link-checker
# Run: blc https://developer.mozilla.org/... -ro
# Quick JavaScript REPL for testing
node
> typeof null
'object'
> [1,2,3].map(x => x * 2)
[ 2, 4, 6 ]
まとめ
概念ページをファクトチェックする際は、次の手順に従ってください。
- まずテストを実行する —
npm testでコードのエラーを自動的に検出できます - すべてのコード例を検証する — 出力コメントが実際の動作と一致している必要があります
- すべての MDN リンクを確認する — リンク切れや不正確な説明は信頼性を損ないます
- 外部リソースを検証する — アクセス可能で、正確かつ JavaScript に焦点を当てた内容である必要があります
- 技術的な主張を監査する — 誤解や根拠のない記述に注意してください
- すべてを記録する — 一貫性のある徹底したレビューには、レポートのテンプレートを使用してください
重要: 読者は、正しい JavaScript を学ぶために私たちを信頼しています。誤った情報が一つあるだけで、解消に何年もかかる混乱を招くことがあります。ファクトチェックを真剣に行ってください。