本文档介绍了 JavaScript 的基本概念、语法和特性。它为刚接触这门语言的开发者或希望巩固基础知识的开发者提供了一个起点。有关更高级的执行概念,请参阅 JavaScript 执行模型。
JavaScript 是一种多范式编程语言,最初设计用于为网页添加交互性。尽管名字里有“Java”,但 JavaScript 与 Java 并无关系——这个名字是在其首次发布时出于营销原因而选择的。JavaScript 现在是世界上最普遍的编程语言之一,不仅用于浏览器,还用于服务器环境、移动应用程序和桌面软件。
JavaScript 语言规范
JavaScript 执行环境图
JavaScript 有两大类值:原始类型和对象。理解不同的值类型是有效使用 JavaScript 的基础。
原始值是 JavaScript 中最简单的数据类型
| 类型 | 示例 | 描述 |
|---|---|---|
字符串 | "Hello" | 文本数据 |
数字 | 42, 3.14 | 数值(整数和浮点数) |
布尔值 | true, false | 逻辑值 |
未定义 | 未定义 | 表示未定义的缺失值 |
null | null | 表示有意缺失的值 |
symbol | Symbol("description") | 唯一且不可变的标识符 |
bigint | 123n | 任意精度整数 |
对象是属性和方法的集合
typeof 操作符用于判断值的类型
| 表达式 | 返回值 |
|---|---|
typeof 42 | "number" |
typeof "abc" | "string" |
typeof true | "boolean" |
typeof undefined | "undefined" |
typeof null | "object" (⚠️ 已知 bug) |
typeof { a: 1 } | "object" |
typeof [1,2,3] | "object" |
typeof function(){} | "function" |
JavaScript 提供了多种声明变量的方式,每种方式都有不同的作用域和重新赋值行为。
| 功能 | var | let | const |
|---|---|---|---|
| 范围 | 函数作用域 | 块作用域 | 块作用域 |
| 提升 (Hoisting) | 被提升,初始值为 undefined | 被提升,但在“暂时性死区” | 被提升,但在“暂时性死区” |
| 重新赋值 | 允许 | 允许 | 不允许 |
| 同一作用域内重新声明 | 允许 | 不允许 | 不允许 |
| 必须初始化 | 否 | 否 | 是 |
示例行为
函数是 JavaScript 中的一等公民,这意味着它们可以被赋值给变量、作为参数传递,以及从其他函数返回。
return 关键字返回值new)来源: get-started/ch2.md296-375 get-started/apA.md64-182
JavaScript 的对象系统基于原型,而非类(尽管 ES6 增加了 class 语法作为原型的语法糖)。
可以使用以下方式创建对象:
{ key: value }new Constructor()Object.create() 方法class 语法原型链图
JavaScript 构建于三大基本支柱之上,它们构成了语言的基础。
JavaScript 核心支柱图
作用域是决定变量可以在何处以及如何访问的规则集合
来源: get-started/ch3.md170-266 get-started/ch4.md12-32
原型系统管理对象关系和行为委托
this 关键字动态指向函数被调用的对象class 语法构建在原型系统之上来源: get-started/ch3.md342-467 get-started/ch4.md34-50
JavaScript 的类型系统包括
=== vs. 宽松 ==)来源: get-started/ch2.md377-514 get-started/ch4.md52-68
JavaScript 提供了几种比较值的方式,在行为上有重要区别。
| 运算符 | 姓名 | 行为 |
|---|---|---|
== | 宽松相等 (Loose equality) | 在比较前执行类型转换 |
=== | 严格相等 (Strict equality) | 不进行类型转换,要求类型和值都相同 |
Object.is() | Same-value 相等性 | 类似于 ===,但能正确处理 NaN 和 -0 |
| 比较 | == | === | Object.is() |
|---|---|---|---|
1 == "1" | true | false | false |
null == undefined | true | false | false |
NaN === NaN | false | false | true |
0 === -0 | true | true | false |
对象按引用比较,而非内容
JavaScript 提供了几种组织代码的模式,最常见的是对象、类和模块。
ES6 为 JavaScript 引入了 class 语法,尽管它只是原型系统的语法糖
模块提供了一种组织代码和控制功能访问的方式
来源: get-started/ch2.md516-574 get-started/ch2.md578-636
JavaScript 是一门多范式语言,支持多种不同的编程风格
| 范式 | 描述 | 示例模式 |
|---|---|---|
| 过程式 | 以自顶向下、线性流程组织代码 | 顺序函数调用 |
| 面向对象 | 通过将逻辑和数据收集到类中来组织代码 | 类、继承 |
| 函数式 | 将代码组织成纯函数和函数组合 | 高阶函数、不可变性 |
let 和 const,对函数作用域变量使用 var===),但要了解何时使用宽松相等(==)更有用