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-262ECMA-402 版本。

新的语言功能,包括引入新的语法和 API 以及修改现有行为,以提案的形式进行讨论。每个提案都经历一个 4 个阶段的过程,通常在第 3 阶段或第 4 阶段由 JavaScript 引擎实现,因此可供公众使用。

有关 ECMAScript 历史的更多信息,请参阅 维基百科 ECMAScript 条目

国际化 API

ECMAScript 国际化 API 规范 是 ECMAScript 语言规范的补充,也由 Ecma TC39 标准化。国际化 API 为 JavaScript 应用程序提供排序 (字符串比较)、数字格式化和日期和时间格式化,允许应用程序选择语言并根据需要调整功能。初始标准于 2012 年 12 月获得批准;浏览器中实现的状态在 Intl 对象的文档中跟踪。国际化规范现在也每年批准一次,浏览器不断改进其实现。

DOM API

WebIDL

WebIDL 规范 提供了 DOM 技术和 ECMAScript 之间的粘合剂。

DOM 的核心

文档对象模型 (DOM) 是一种跨平台的、与语言无关的约定,用于表示和交互 HTML、XHTML 和 XML 文档中的对象。DOM 树中的对象可以通过使用对象上的方法进行寻址和操作。 W3C 对核心文档对象模型进行标准化,该模型定义了与语言无关的接口,将 HTML 和 XML 文档抽象为对象,并定义了操作此抽象的机制。在 DOM 定义的事项中,我们可以找到

从 ECMAScript 的角度来看,DOM 规范中定义的对象被称为“宿主对象”。

HTML DOM

HTML,网络的标记语言,是根据 DOM 规范进行定义的。在 DOM 核心定义的抽象概念之上,HTML 还定义了元素的含义。HTML DOM 包含诸如 HTML 元素上的 className 属性,或 document.body 等 API。

HTML 规范还定义了文档的限制;例如,它要求所有 <ul> 元素(表示无序列表)的子元素必须是 <li> 元素,因为它们代表列表项。一般来说,它还禁止使用未在标准中定义的元素和属性。

寻找 Document 对象,Window 对象和其他 DOM 元素?请阅读 DOM 文档

其他值得注意的 API

非浏览器环境(如 Node.js)通常没有 DOM API——因为它们不与文档交互——但它们通常仍然实现许多 Web API,例如 fetch()setTimeout()

JavaScript 实现

在浏览器环境及其他环境中,主要有三种 JavaScript 实现。

  • Mozilla 的 SpiderMonkey,用于 Firefox。这是第一个真正的 JavaScript 引擎,由 Brendan Eich 在 Netscape 创建。
  • Google 的 V8,用于 Google Chrome、Opera、Edge、Node.jsDenoElectron 等等。
  • 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 是独立的环境,类似于 Perl 或 Python。

  • Node.js - Node.js 是一个用于轻松构建快速、可扩展的网络应用程序的平台。
  • ShellJS - Node.js 的可移植 Unix shell 命令。

基于浏览器的 JavaScript Shell

以下 JavaScript Shell 通过浏览器的 JavaScript 引擎运行代码。

工具和资源

有助于编写和调试 JavaScript 代码的工具。

Firefox 开发者工具

Web 控制台JavaScript Profiler调试器 等等。

学习 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 的访问。