JavaScript 技术概述
HTML 定义了网页的结构和内容,CSS 设置了格式和外观,而 JavaScript 则为网页添加了交互性并创建了丰富的 Web 应用程序。
然而,在 Web 浏览器语境下所理解的“JavaScript”这个总称包含几个非常不同的元素。其中之一是核心语言 (ECMAScript),另一个是 Web API 的集合,包括 DOM(文档对象模型)。
JavaScript,核心语言 (ECMAScript)
JavaScript 的核心语言由 ECMA TC39 委员会标准化为 ECMAScript 语言。“ECMAScript”是语言标准的术语,但“ECMAScript”和“JavaScript”可以互换使用。
此核心语言也用于非浏览器环境,例如在 Node.js 中。
ECMAScript 范围包括什么?
除其他外,ECMAScript 定义了:
- 语言语法(解析规则、关键字、控制流、对象字面量初始化等)
- 错误处理机制(
throw
、try...catch
、创建用户定义Error
类型的能力) - 类型(布尔值、数字、字符串、函数、对象等)
- 基于原型的继承机制
- 内置对象和函数,包括
JSON
、Math
、Array
方法、parseInt
、decodeURI
等。 - 严格模式
- 一个模块系统
- 基本内存模型
标准化过程
ECMAScript 版本每年由 ECMA 大会批准并作为标准发布。所有开发都在 Ecma TC39 GitHub 组织上公开进行,该组织托管提案、官方规范文本和会议记录。
在 ECMAScript 的第 6 版(称为 ES6)之前,规范每隔几年发布一次,通常以其主要版本号(ES3、ES5 等)来称呼。ES6 之后,规范以发布年份命名——ES2017、ES2018 等。ES6 等同于 ES2015。_ESNext_ 是一个动态名称,指编写时下一个版本。ESNext 特性更准确地称为提案,因为根据定义,该规范尚未最终确定。
ECMA-262 当前委员会批准的快照可在 Ecma International 的 ECMA-262 语言规范页面上以 PDF 和 HTML 格式获取。ECMA-262 和 ECMA-402 由规范编辑持续维护并保持最新;TC39 网站托管最新的 ECMA-262 和 ECMA-402 版本。
新的语言特性,包括引入新的语法和 API 以及修订现有行为,以提案的形式进行讨论。每个提案都经过一个 4 阶段过程,通常由 JavaScript 引擎在第 3 阶段或第 4 阶段实现,因此可供公众使用。
有关 ECMAScript 历史的更多信息,请参阅维基百科 ECMAScript 条目。
国际化 API
ECMAScript 国际化 API 规范是 ECMAScript 语言规范的补充,也由 Ecma TC39 标准化。国际化 API 为 JavaScript 应用程序提供排序(字符串比较)、数字格式和日期时间格式,让应用程序选择语言并根据其需求定制功能。初始标准于 2012 年 12 月批准;浏览器中实现的状况在 Intl
对象的文档中进行跟踪。国际化规范如今也每年批准一次,并且浏览器不断改进其实现。
相关资源
您可以通过多种方式参与或仅跟踪 ECMAScript 语言规范和 ECMAScript 国际化 API 规范以及相关资源的当前工作:
DOM API
WebIDL
WebIDL 规范提供了 DOM 技术和 ECMAScript 之间的连接。
DOM 的核心
文档对象模型(DOM)是一种跨平台、**语言无关的约定**,用于表示和操作 HTML、XHTML 和 XML 文档中的对象。**DOM 树**中的对象可以通过使用对象上的方法进行寻址和操作。如今,DOM 核心规范由 WHATWG 维护(取代了 W3C 版本)。它定义了与语言无关的接口,将 HTML 和 XML 文档抽象为对象,还定义了操作此抽象的机制。这包括:Node
、Element
、DocumentFragment
、Document
、DOMImplementation
、Event
、EventTarget
等。
从 ECMAScript 的角度来看,DOM 规范中定义的对象称为“宿主对象”。
HTML DOM
HTML,即 Web 的标记语言,是根据 DOM 进行规范的。在 DOM 核心中定义的抽象概念之上,HTML 还定义了元素的_含义_。HTML DOM 包括 HTML 元素上的 className
属性,或 Document.body
等 API。
HTML 规范还定义了文档的限制;例如,它要求表示无序列表的 <ul>
元素的所有子元素都是 <li>
元素,因为它们表示列表项。一般来说,它还禁止使用未在标准中定义的元素和属性。
正在寻找 Document
对象、Window
对象和其他 DOM 元素?请阅读 DOM 文档。
其他值得注意的 API
setTimeout()
和setInterval()
函数最初是在 HTML Standard 中的Window
接口上指定的。- XMLHttpRequest 可以发送异步 HTTP 请求。
- Fetch API 为网络请求提供了更符合人体工程学的抽象。
- CSS 对象模型将 CSS 规则抽象为对象。
- WebWorkers 允许并行计算。
- WebSockets 允许低级双向通信。
- Canvas 2D Context 是
<canvas>
的绘图 API。 - WebAssembly 接口提供了 JavaScript 代码和 WebAssembly 模块之间通信的实用工具。
非浏览器环境(如 Node.js)通常没有 DOM API——因为它们不与文档交互——但它们通常仍然实现许多 Web API,例如 fetch()
和 setTimeout()
。
JavaScript 实现
当前 Web 浏览器中使用的 JavaScript 引擎包括:
- Mozilla 的 SpiderMonkey,用于 Firefox、Servo 和 Flow。其他非浏览器用途包括 MongoDB、CouchDB 等。这是 Brendan Eich 在 Netscape 创建的_第一个_ JavaScript 引擎。
- Google 的 V8,用于 Chrome 和基于 Chromium 的浏览器,如 Opera、Edge 和 Brave。其他非浏览器用途包括 Node.js、Deno、Electron 等。
- Apple 的 JavaScriptCore(也称为 SquirrelFish/Nitro),用于 Safari 和其他基于 WebKit 的浏览器。其他非浏览器用途包括 Bun。
- LibJS,用于 Ladybird。
早期浏览器中使用的某些 JavaScript 引擎包括:
- Carakan,在 Opera 成为基于 Chromium 的浏览器之前使用。
- Microsoft 的 Chakra,用于 Internet Explorer(尽管它实现的语言正式称为“JScript”,以避免商标问题)。早期版本的 Edge 使用另一个 JavaScript 引擎,令人困惑地也称为 Chakra,然后才成为基于 Chromium 的浏览器。
某些专门为非浏览器目的定制的 JavaScript 引擎包括:
- Engine262,用 JavaScript 编写,本质上旨在作为语言的参考实现。
- Meta 的 Hermes,针对 React Native 进行了优化。
- Mozilla 的 Rhino,用 Java 编写。
- Oracle 的 GraalJS,用 Java 编写并基于 GraalVM 构建。
- Moddable XS,用于物联网/嵌入式系统。
- QuickJS,旨在小巧轻便。
JavaScript 引擎公开了一个公共 API,应用程序开发人员可以使用它将 JavaScript 集成到他们的软件中。到目前为止,JavaScript 最常见的宿主环境是 Web 浏览器。Web 浏览器通常使用公共 API 创建负责将 DOM 反映到 JavaScript 中的**宿主对象**。
JavaScript 的另一个常见应用是作为(Web)服务器端脚本语言。JavaScript Web 服务器公开代表 HTTP 请求和响应对象的宿主对象,然后 JavaScript 程序可以操作这些对象以动态生成网页。Node.js 是一个流行的示例。
Shell
JavaScript shell 允许您快速测试 JavaScript 代码片段,而无需重新加载网页。它们对于开发和调试代码非常有用。
独立 JavaScript shell
以下 JavaScript shell 是独立的运行环境,例如 Perl 或 Python。
- Node.js - Node.js 是一个用于轻松构建快速、可伸缩网络应用程序的平台。
- ShellJS - 用于 Node.js 的便携式 Unix shell 命令。
基于浏览器的 JavaScript shell
以下 JavaScript shell 通过浏览器的 JavaScript 引擎运行代码。
- Firefox 有一个内置的 JavaScript 控制台,支持多行编辑。
- Babel REPL - 一个基于浏览器的 REPL,用于试验未来的 JavaScript。
- TypeScript playground — 一个基于浏览器的游乐场,用于试验新的 JavaScript 特性(通过 tsc 编译器)和 TypeScript 语法。
工具和资源
编写和调试 JavaScript 代码的有用工具。
- Firefox 开发者工具
-
Web Console、JavaScript Profiler、Debugger 等。
- 学习 JavaScript
-
对于有抱负的 Web 开发人员来说,这是一个极好的资源——在交互式环境中学习 JavaScript,包括短课程和交互式测试,并通过自动化评估进行指导。前 40 节课是免费的,完整课程只需一次小额付款。
- TogetherJS
-
协作变得简单。通过将 TogetherJS 添加到您的网站,您的用户可以实时在网站上互相帮助!
- Stack Overflow
-
Stack Overflow 上带有“JavaScript”标签的问题。
- JSFiddle
-
编辑 JavaScript、CSS 和 HTML 并获得实时结果。使用外部资源并在线与您的团队协作。
- Plunker
-
Plunker 是一个在线社区,用于创建、协作和分享您的 Web 开发想法。编辑您的 JavaScript、CSS 和 HTML 文件并获得实时结果和文件结构。
- JS Bin
-
JS Bin 是一个开源的协作式 Web 开发调试工具。
- CodePen
-
CodePen 是另一个协作式 Web 开发工具,用作实时结果游乐场。
- StackBlitz
-
StackBlitz 是另一个在线游乐场/调试工具,可以使用 React、Angular 等托管和部署全栈应用程序。
- RunJS
-
RunJS 是一个桌面游乐场/便笺簿工具,提供实时结果并可访问 Node 和浏览器 API。