JavaScript 技术概述

HTML 定义了网页的结构和内容,CSS 设置了格式和外观,而 JavaScript 则为网页添加了交互性并创建了丰富的 Web 应用程序。

然而,在 Web 浏览器语境下所理解的“JavaScript”这个总称包含几个非常不同的元素。其中之一是核心语言 (ECMAScript),另一个是 Web API 的集合,包括 DOM(文档对象模型)。

JavaScript,核心语言 (ECMAScript)

JavaScript 的核心语言由 ECMA TC39 委员会标准化为 ECMAScript 语言。“ECMAScript”是语言标准的术语,但“ECMAScript”和“JavaScript”可以互换使用。

此核心语言也用于非浏览器环境,例如在 Node.js 中。

ECMAScript 范围包括什么?

除其他外,ECMAScript 定义了:

  • 语言语法(解析规则、关键字、控制流、对象字面量初始化等)
  • 错误处理机制(throwtry...catch、创建用户定义 Error 类型的能力)
  • 类型(布尔值、数字、字符串、函数、对象等)
  • 基于原型的继承机制
  • 内置对象和函数,包括 JSONMathArray 方法、parseIntdecodeURI 等。
  • 严格模式
  • 一个模块系统
  • 基本内存模型

标准化过程

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 文档抽象为对象,还定义了操作此抽象的机制。这包括:NodeElementDocumentFragmentDocumentDOMImplementationEventEventTarget 等。

从 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。