JavaScript 技术概述
而 HTML 定义了网页的结构和内容, CSS 设置了格式和外观, JavaScript 为网页添加了交互性并创建了丰富的 Web 应用程序。
但是,在 Web 浏览器环境中理解的 "JavaScript" 这个总称包含了几个非常不同的元素。其中一个是核心语言 (ECMAScript),另一个是 Web API 的集合,包括 DOM (文档对象模型)。
JavaScript,核心语言(ECMAScript)
JavaScript 的核心语言由 ECMA TC39 委员会标准化为一种名为 ECMAScript 的语言。 "ECMAScript" 是语言标准的术语,但 "ECMAScript" 和 "JavaScript" 可以互换使用。
这种核心语言也用于非浏览器环境,例如在 Node.js 中。
哪些内容属于 ECMAScript 范围?
标准化过程
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 个阶段的过程,通常在第 3 阶段或第 4 阶段由 JavaScript 引擎实现,因此可供公众使用。
有关 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 树中的对象可以通过使用对象上的方法进行寻址和操作。 W3C 对核心文档对象模型进行标准化,该模型定义了与语言无关的接口,将 HTML 和 XML 文档抽象为对象,并定义了操作此抽象的机制。在 DOM 定义的事项中,我们可以找到
- 文档结构、树模型和 DOM 事件架构在 DOM 核心 中:
Node
、Element
、DocumentFragment
、Document
、DOMImplementation
、Event
、EventTarget
、... - DOM 事件 中的 DOM 事件架构的定义不太严格,以及特定事件。
- 其他内容,例如DOM 遍历 和 DOM 范围。
从 ECMAScript 的角度来看,DOM 规范中定义的对象被称为“宿主对象”。
HTML DOM
其他值得注意的 API
setTimeout
和setInterval
函数最初是在 HTML 标准的Window
接口中定义的。- XMLHttpRequest 使得发送异步 HTTP 请求成为可能。
- Fetch API 为网络请求提供了更符合人体工程学的抽象。
- CSS 对象模型 将 CSS 规则抽象为对象。
- Web Workers 允许并行计算。
- WebSockets 允许低级别的双向通信。
- Canvas 2D 上下文 是针对
<canvas>
的绘图 API。 - WebAssembly 接口 提供了用于在 JavaScript 代码和 WebAssembly 模块之间进行通信的工具。
非浏览器环境(如 Node.js)通常没有 DOM API——因为它们不与文档交互——但它们通常仍然实现许多 Web API,例如 fetch()
和 setTimeout()
。
JavaScript 实现
在浏览器环境及其他环境中,主要有三种 JavaScript 实现。
- Mozilla 的 SpiderMonkey,用于 Firefox。这是第一个真正的 JavaScript 引擎,由 Brendan Eich 在 Netscape 创建。
- Google 的 V8,用于 Google Chrome、Opera、Edge、Node.js、Deno、Electron 等等。
- Apple 的 JavaScriptCore(也称为 SquirrelFish/Nitro),用于 WebKit 浏览器(如 Apple Safari)和 Bun。
除了以上实现之外,还有其他流行的 JavaScript 引擎,例如
- Carakan,用于早期版本的 Opera。
- 微软的 Chakra 引擎,用于 Internet Explorer(尽管它实现的语言正式称为“JScript”以避免商标问题)。早期版本的 Edge 使用了另一个名为 Chakra 的 JavaScript 引擎,令人困惑。
- LibJS,用于 SerenityOS 的浏览器实现。
- Mozilla 的 Rhino 引擎,一个用 Java 编写的 JavaScript 实现,主要由 Norris Boyd(也在 Netscape 工作)创建。
有一些引擎专门针对非浏览器用途而定制。
- Engine262,一个用 JavaScript 编写的 JavaScript 引擎。它是为 JavaScript 开发者探索新的语言特性和查找规范中的错误而创建的。
- Moddable XS,用于嵌入式系统(如物联网)。
- QuickJS,一个小型且可嵌入的 JavaScript 引擎。
- Meta 的 Hermes 引擎,一个针对 React Native 优化的引擎。
- Oracle 的 GraalJS,一个由 Oracle Labs 在 GraalVM 上构建的高性能实现。
JavaScript 引擎公开了一个公共 API,应用程序开发者可以使用它将 JavaScript 集成到他们的软件中。到目前为止,JavaScript 最常见的宿主环境是 Web 浏览器。Web 浏览器通常使用公共 API 创建宿主对象,这些对象负责将 DOM 反映到 JavaScript 中。
JavaScript 的另一个常见应用是作为(Web)服务器端脚本语言。JavaScript Web 服务器公开宿主对象,这些对象代表 HTTP 请求和响应对象,然后可以由 JavaScript 程序操作以动态生成网页。Node.js 就是一个流行的例子。
外壳
JavaScript Shell 允许您快速测试 JavaScript 代码片段,而无需重新加载网页。它们对开发和调试代码非常有用。
独立 JavaScript Shell
基于浏览器的 JavaScript Shell
以下 JavaScript Shell 通过浏览器的 JavaScript 引擎运行代码。
- Firefox 有一个 内置 JavaScript 控制台,支持多行编辑。
- Babel REPL - 一个基于浏览器的 REPL,用于试验未来的 JavaScript。
- TypeScript Playground — 一个基于浏览器的 Playground,用于试验新的 JavaScript 特性(通过 tsc 编译器)和 TypeScript 语法。
工具和资源
有助于编写和调试 JavaScript 代码的工具。
- Firefox 开发者工具
- 学习 JavaScript
-
一个适合有抱负的 Web 开发者的优秀资源——在一个交互式环境中学习 JavaScript,包含简短的课程和交互式测试,由自动评估引导。前 40 课免费,完整课程可通过一次性小额付费获取。
- TogetherJS
-
协作变得轻松。通过将 TogetherJS 添加到您的网站,您的用户可以在网站上实时互相帮助!
- Stack Overflow
-
Stack Overflow 上带有“JavaScript”标签的问题。
- JSFiddle
-
编辑 JavaScript、CSS 和 HTML 并获取实时结果。使用外部资源并与您的团队在线协作。
- Plunker
-
Plunker 是一个在线社区,用于创建、协作和分享您的 Web 开发想法。编辑您的 JavaScript、CSS 和 HTML 文件,并获取实时结果和文件结构。
- JSBin
-
JS Bin 是一款开源的协作式 Web 开发调试工具。
- Codepen
-
Codepen 是另一个协作式 Web 开发工具,用作实时结果游乐场。
- StackBlitz
-
StackBlitz 是另一个在线 Playground/调试工具,它可以使用 React、Angular 等托管和部署全栈应用程序。
- RunJS
-
RunJS 是一款桌面 Playground/记事本工具,它提供实时结果以及对 Node 和浏览器 API 的访问。