关于 fact-check
fact-check 是一项用于核查 JavaScript 概念文档技术准确性的技能。它引导审阅者检查代码示例、MDN 与规范引用、外部资源及正文中的技术主张。
主要功能
- 01核对代码输出与行为
- 02检查 MDN 链接和 API 描述
- 03参照 ECMAScript 规范
- 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 的描述不准确
事实核查方法
请按顺序完成以下五个阶段,以进行完整的事实核查。
阶段 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 链接
- 验证链接返回状态码 200(而非 404)
- 确认链接页面与所引用的内容相符
-
核实 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/
| 概念 | 规范章节 |
|---|---|
| 类型强制转换 | 抽象操作(7.1) |
| 相等性 | 抽象相等比较(7.2.14)、严格相等(7.2.15) |
| typeof | typeof 运算符(13.5.3) |
| 对象 | 普通对象和异质对象的行为(10) |
| 函数 | ECMAScript 函数对象(10.2) |
| this 绑定 | ResolveThisBinding(9.4.4) |
| Promise | Promise 对象(27.2) |
| 迭代 | 迭代(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 | 主要内容并非关于其他语言 |
| 内容未过时 | 现代 JavaScript 主题的资源发布于 2015 年之后 |
| 描述准确 | 我们的描述与实际内容相符 |
| 无反模式 | 不会教授不良实践 |
| 来源可靠 | 来自知名或可信的创作者 |
外部资源中的警示信号
- 涉及 ES6 及更高版本主题时,到处使用
var - 在讲解 Promise/异步的内容中使用回调
- 将 jQuery 作为现代 DOM 操作方式来教授
- 包含关于 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
- 第 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 知识。哪怕一条错误信息,也可能造成困扰,而且需要多年才能纠正。请认真对待事实核查。