JavaScript 文档
简洁、以示例为主的 JavaScript 参考文档。先读概念,再看代码,然后在 Coddy 学习旅程中动手练习。
开始课程入门
- JavaScript 是什么JavaScript 到底是什么,在哪里运行,能用来做什么,以及它和 Java、TypeScript 有什么区别:一篇写给初学者的扎实入门。
- 运行 JS2026 年运行 JavaScript 的几种实用方式:浏览器控制台、HTML 中的 script 标签、在终端里用 Node.js,以及各自适用的场景。
- 语法与分号JavaScript 语法如何工作:语句、代码块、表达式,以及关于分号、自动分号插入和它何时坑你的真实情况。
- 严格模式JavaScript 严格模式改变了什么,如何开启,以及为什么现代代码(模块和类)会自动启用它。
- 注释JavaScript 注释怎么写:单行用 `//`,多行用 `/* */`,以及让注释真正有用而不是沦为噪音的好习惯。
变量与类型
- let、const、varJavaScript 中声明变量的三种方式,以及为什么现代代码默认用 `const`,必要时用 `let`,而 `var` 基本不用。
- 原始类型JavaScript 的七种原始类型:string、number、bigint、boolean、null、undefined 和 symbol,以及它们与对象的区别。
- 字符串与模板JavaScript 中字符串的用法:引号、反引号、插值、多行文本,以及你真正会用到的方法。
- 数字与 BigIntJavaScript 的 Number 类型实际上是怎么工作的:浮点数精度、MAX_SAFE_INTEGER,以及什么时候应该改用 BigInt。
- null 与 undefinedJavaScript 中 null 和 undefined 到底有什么区别,如何判断它们,以及在自己的代码里该用哪一个。
- 类型转换JavaScript 如何在类型之间转换值:容易让人踩坑的隐式规则,你应该优先使用的显式转换,以及它们各自何时发生。
- 相等运算符JavaScript 中的相等比较是怎么工作的:严格相等与宽松相等、== 的怪异之处、NaN 和对象的表现,以及何时使用 Object.is。
流程控制
- 运算符JavaScript 提供的各种运算符:做数学运算、比较值、组合布尔值和赋值,以及实践中真正会踩坑的怪现象。
- if / elseJavaScript 中 if/else 的工作方式:条件、else if 链、真值判断的坑,以及何时改用三元运算符。
- switch 语句JavaScript switch 语句的用法:case、break、default、穿透,以及什么时候 switch 比一串 if/else 更合适。
- for 循环JavaScript 中经典 `for` 循环的工作方式:三段式循环头、遍历数组、break 和 continue、嵌套循环,以及常见陷阱。
- while 循环JavaScript 中的 `while` 和 `do...while` 循环如何工作:什么时候该用它们代替 `for`,以及如何避免无限循环。
- for...of 与 for...inJavaScript 中 for...of 和 for...in 到底有什么不同:值与键、数组与对象,以及各自该在什么时候用。
- 真值与假值JavaScript 中哪些值是真值、哪些是假值,假值的完整列表,以及布尔转换在真实代码中是怎样发生的。
迭代
函数
- 函数声明如何在 JavaScript 中声明函数:function 关键字、参数、返回值、提升,以及何时用函数声明、何时用函数表达式。
- 箭头函数JavaScript 中箭头函数的工作方式:`=>` 语法、隐式返回、它们如何处理 `this`,以及什么时候该用它代替 `function`。
- 参数与默认值JavaScript 中的参数是怎么工作的:默认值、只由 undefined 触发的规则、求值顺序,以及形参和实参的区别。
- 剩余与展开JavaScript 中 ... 运算符的用法:用剩余参数收集实参,用展开语法展开数组和对象,以及各自适用的场景。
- 闭包闭包就是能记住周围变量的函数。本文用可运行的示例和真实场景,讲清 JavaScript 闭包是如何工作的。
- this 关键字`this` 在 JavaScript 中到底如何工作:四条绑定规则,箭头函数为什么不一样,以及如何避开经典的“this 是 undefined”陷阱。
- 高阶函数JavaScript 中的高阶函数:把函数作为参数传递、从函数中返回函数,以及你每天都会用到的 map/filter/reduce 模式。
对象与数组
- 对象JavaScript 对象实际上是怎么工作的:创建对象、读写属性、添加方法,以及让对象代码保持清晰的常用写法。
- 数组JavaScript 中数组的工作方式:创建数组、索引、length、push/pop、slice 与 splice 的区别,以及读起来最清晰的循环写法。
- 解构赋值JavaScript 中的解构赋值是怎么工作的:从对象和数组中取值、重命名、默认值、嵌套模式以及函数参数。
- 对象展开JavaScript 对象展开运算符的用法:克隆、合并、覆盖属性,以及常让人踩坑的浅拷贝问题。
- 数组方法能取代大部分 for 循环的数组方法:map、filter、reduce、find、some、every,以及哪些会修改原数组、哪些会返回新数组。
- Map 与 SetJavaScript 的 Map 和 Set 是怎样工作的,它们与普通对象和数组有什么不同,以及什么时候用它们最划算。
- JSON如何把 JavaScript 对象转换成 JSON 再转换回来:JSON.stringify、JSON.parse、replacer 和 reviver 钩子,以及哪些值经不起这一来一回。
- 可选链`?.` 运算符如何让你深入访问嵌套的对象、数组和方法,而不会因为 null 或 undefined 而出错。
- 空值合并`??` 运算符如何只在值为 `null` 或 `undefined` 时才使用默认值,以及为什么在大多数实际场景中它比 `||` 更好。
类与原型
- 类JavaScript 类到底是怎么工作的:构造函数、方法、实例字段、getter 和 setter,以及 `class` 关键字背后的思维模型。
- 继承JavaScript 类的继承是怎样工作的:extends、super、重写方法,以及什么时候不该用继承。
- 静态成员JavaScript 类中静态方法和静态属性的用法:何时使用,`this` 的行为,以及它们实现的工厂模式。
- 私有字段`#` 前缀如何让 JavaScript 类的字段和方法真正私有:语法、规则,以及为什么下划线约定还不够。
- 原型JavaScript 原型到底是什么,原型链如何查找属性,以及 `class` 语法如何对应到同一套底层机制。
异步 JavaScript
- 事件循环理解异步 JavaScript 的思维模型:调用栈、任务队列、微任务队列,以及事件循环如何把它们串在一起。
- 回调函数JavaScript 中回调函数的工作方式:把函数作为参数传递、错误优先模式,以及为什么层层嵌套的回调促使社区转向了 Promise。
- PromiseJavaScript 中 Promise 的工作原理:三种状态,用 then 和 catch 链式调用,用 Promise.all 组合,以及用 new Promise 自己创建。
- async/awaitJavaScript 中 async/await 的真正工作方式:async 函数、等待 Promise、用 try/catch 处理错误,以及并行运行任务。
- Fetch API如何在 JavaScript 中使用 Fetch API:GET 和 POST 请求、解析 JSON、正确处理错误,以及中止过慢的请求。
- 异步错误处理错误在异步 JavaScript 中究竟如何传递:async/await 配合 try/catch、Promise 的 .catch,以及那些会悄悄吞掉失败的陷阱。
模块与工具
- ES 模块JavaScript 中的 ES 模块是怎么工作的:具名导出和默认导出、import 语法、动态 import(),以及区分模块与普通脚本的那些规则。
- CommonJS 与 ESMJavaScript 自带的两种模块系统:为什么两者并存,以及在 Node 项目中如何在 require 和 import 之间做选择。
- npm 基础npm 实际上是怎么工作的:安装包、init、开发依赖、更新,以及理解 node_modules 和锁文件的思路。
- package.jsonpackage.json 里都有什么:重要的字段、脚本如何工作,以及 semver 版本范围如何决定 npm 安装哪个版本。
- Node 运行时Node.js 运行时是什么,它和浏览器有什么不同,以及让服务器端 JavaScript 成为可能的核心 API:全局对象、模块、process 和 fs。