什么是 JavaScript?

169 阅读4分钟

一、JavaScript 实现

虽然 JavaScript 与 ECMAScript 基本上是同义词,但 JavaScript 远远不限于 ECMA-262 所定义的那样。

完整的 JavaScript 实现包含以下几个部分:

  • 核心(ECMAScript)
  • 文档对象模型(DOM)
  • 浏览器对象模型 (BOM)

1. ECMAScript

ECMAScript,即 ECMA-262 定义的语言,并不局限于 Web浏览器。

事实上,这门语言没有输入和输出之类的方法。

ECMA-262 将这门语言作为一个基准来定义,以便在它之上再构建更稳健的脚本语言。

Web 浏览器只是 ECMAScript 实现可能存在的一种宿主环境,宿主环境提供 ECMAScript 的基准实现和与环境自身交互必需的扩展。

扩展(比如 DOM)使用 ECMAScript 的核心类型和语法,提供特定于环境的额外功能。

其他宿主环境还有服务器端 JavaScript 平台 Node.js 和 Adobe Flash。

在基本的层面,ECMA-262 描述这门语言的如下部分:

  • 语法
  • 类型
  • 语句
  • 关键字
  • 保留字
  • 操作符
  • 全局对象

ECMAScript 只是对实现这个规范描述的所有方面的一门语言的称呼。JavaScript 实现了 ECMAScript,而 Adobe ActionScript 同样也实现了 ECMAscript。

1.1 ECMAScript 版本

ECMA-262 要求支持 Unicode 标准(以支持多种语言),而且对象要与平台无关。

ECMA-262 第1版:本质上跟网景的 JavaScript1.1 相同,只不过删除了所有浏览器特定的代码,外加少量细微的修改。

ECMA-262 第2版:编校工作,并没有增减或改变任何特性。

ECMA-262 第3版:更新了字符串处理、错误定义和数值输出,增加了对正则表达式、新的控制语句、try/catch异常处理的支持。

ECMA-262 第4版:由于跳跃太大,正式发布之前被放弃。

ECMA-262 第5版:原生的解析和序列化 JSON 数据的 JSON 对象、方便继承和高级属性定义的方法,以及严格模式。

ECMA-262 第6版:ES6 正式支持类、模块、迭代器、生成器、箭头函数、期约(Promise)、反射、代理和众多新的数据类型。

ECMA-262 第7版:Array.prototype.includes 和指数操作符。

ECMA-262 第8版:异步函数(async/await)、SharedArrayBuffer 及 Atomic API,Object.values()、Object.entries()、Object.getOwnPropertyDescriptors() 和字符串填充方法,明确支持对象字面量最后的逗号。

ECMA-262 第9版:修订异步迭代、剩余和扩展属性、一组新的正则表达式特性、Promise finally(),以及模板字面量修订。

ECMA-262 第10版:修订 Array.prototype.flat()/flatMap()、String.prototypeople.trimStart()/trimEnd()、Object.fromEntries()方法,以及 Symbol.prototype.description属性,明确定义了Function.prototype.toString() 的返回值并固定了Array.prototype.sort() 的顺序,解决了与 JSON 字符串兼容的问题,定义了 catch 子句的可选绑定。

2. DOM

文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在 HTML 中使用扩展的 XML。

DOM 将整个页面抽象为一组分层节点。

HTML 或 XML 页面的每个组成部分都是一种节点,包含不同的数据。

DOM 通过创建表示文档的树,让开发者可以随心所欲地控制网页的内容和结构。使用 DOM API 可以轻松地删除、添加、替换、修改节点。

注意:DOM 并非只能通过 JavaScript 访问,而且确实被其他很多语言实现了。不过对于浏览器来说,DOM 就是使用 ECMAScript 实现的,如今已经成为 JavaScript 语言的一大组成部分。

注意:并没有一个标准叫“DOM Level0”,这只是 DOM 历史中的一个参照点。DOM Level0 可以看作 IE4 和 Netscape Navigator 4 中最初支持的 DHTML。

3. BOM

IE3 和 Netscape Navigator3 提供了** 浏览器对象模型(BOM) ** API,用于支持访问和操作浏览器的窗口。

使用 BOM,开发者可以操控浏览器显示页面之外的部分。

BOM 是唯一一个没有相关标准的 JavaScript 实现。HTML5 以正式规范的形式涵盖了尽可能多的 BOM 特性。

BOM 主要针对浏览器窗口和子窗口(frame) ,不过人们通常会把任何特定于浏览器的扩展都归在 BOM 的范畴内。比如以下扩展:

  • 弹出新浏览器窗口的功能;
  • 移动、缩放和关闭浏览器窗口的功能;
  • navigator 对象,提供关于浏览器的详尽信息;
  • location 对象,提供浏览器加载页面的详尽信息;
  • screen 对象,提供关于用户屏幕分辨率的详尽信息;
  • performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息;
  • 对 cookie 的支持;
  • 其他自定义对象,如 XMLHttpRequest 和 IE 的 ActiveXObject。

二、小结

JavaScript 是一门用来与网页交互的脚本语言,包含以下三个组成部分:

  1. ECMAScript:由 ECMA-262 定义并提供核心功能。
  2. 文档对象模型DOM:提供与网页内容交互的方法和接口。
  3. 浏览器对象模型BOM:提供与浏览器交互的方法和接口。