JavaScript高级程序设计(第4版)- 第1章:什么是JavaScript
第1章 什么是JavaScript
1.1 JavaScript历史
- 1995年:JavaScript问世
- 1996年:JavaScript发展
- 1997年:制定规范
在讨论JavaScript为什么会产生之前我们最好先了解一下在JS产生之前,浏览器验证表单的原理,即一次验证是需要客户端和服务器端进行一次通信的。想想那个时候大家用的都是调制解调器上网,你输入一个账户名提交表单,30秒后服务器端传来回复“输入格式错误,请重新输入”,实在让人抓狂。
因此在2015年,网景公司就在它新推出的浏览器Netscape Navigator2中开发了一个新的客户端脚本语言。主要用途就是在客户端直接处理某些基本的验证。一开始将这种脚本语言取名为Mocha(音译摩卡,Java同款咖啡名),又换成了LiveScript,最后为了蹭Java的热度改成了JavaScript。
Netscape的成功让微软一看直呼“我可以”,于是在IE3中也开发了一款JScript(看出来了,这些公司是真的不想费心思起名),在1996年进入Web浏览器领域,宣告着JS作为一门语言向前迈进了一大步。
而Netscape的JavaScript和Microsoft的JScript就存在着规范差异,因此在1997年,欧洲计算机制造商协会(ECMA)就此召集了各路神仙打造出了ECMAScript(ek-ma-script)
1.2 JavaScript实现
当然,JavaScript和ECMAScript不是一个东西,JavaScript包括以下三个部分:
- 核心(ECMAScript):由ECMA-262定义并提供核心功能
- 文档对象模型(DOM):由W3C规范,提供与网页内容交互的方法和接口
- 浏览器对象模型(BOM):由HTML5规范,提供与浏览器交互的方法和接口
1.2.1 ECMAScript
ECMAScript是一个基准,Web浏览器作为其宿主环境(host enviroment),为ECMAScript提供基准实现和与环境交互必需的扩展,宿主环境还可以是服务器端Node.js这类平台。
ECMA-262标准定义了如下7个部分:
- 语法
- 类型
- 语句
- 关键字
- 保留字
- 操作符
- 全局对象
ECMAScript则是对实现了ECMA-262所有语言的统称
1.2.1.1 ECMAScript 版本
- 第1版:和Netscape的JavaScript1.1相同,删除了浏览器平台特定的代码,支持Unicode标准(支持多语言)
- 第2版:主要是编校,没有对特性的修改
- 第3版:更新了字符串处理、错误定义、数值输出、正则表达式、新控制语句、try/catch异常处理
- 第4版:彻底修订,包括强类型变量、新语句、数据结构、真正的类、经典继承、操作数据新手段
- 第5版:因为第4版改动太大,因此在正式版发布前就被放弃,而之前提出的一个简单改进子版本被拿来作为第5版,于2009.12.3被发布。第5版致力于厘清第3版存在的歧义,并提出了一些新功能:原生解析、序列化JSON数据的JSON对象、方便继承和高级属性定义的方法、增强ECMAScript引擎解释和执行代码能力的严格模式等。
- 第6版:俗称ES6、ES2015、ES Harmony,于2015.6发布,正式支持了类、模块、迭代器、生成器、箭头函数、期约、反射、代理和众多新的数据类型。
- 第7版:2016.6发布,增强了Array、prototype、includes和指数操作符等少量新特性
- 第8版:2017.6发布,增加了异步函数(async/await)及Atomics API等
- 第9版:2018.6发布,更新了异步迭代、剩余、扩展属性、新的正则表达式特性等
- 第10版:2019.6发布,解决了与JSON字符串兼容的问题等
1.2.1.2 ECMAScript符合性
要成为ECMAScript家族中的一员,必须满足两点:
- 支持ECMA-262中描述的所有“类型、值、对象、属性、函数、语法、语义”
- 支持Unicode字符标准
在此基础上,ECMAScript语言可以自行进行如下扩充:
- 对类型、值、对象、函数进行扩充
- 对程序、正则表达式语法进行扩充
1.2.1.3 浏览器对ECMAScript的支持
1.2.2 DOM
文档对象模型(Document Object Model)是个应用编程API,DOM将成个页面抽象为一组分层节点,即创建表示文档的树。
如下列页面代码:
<html>
<head>
<title>Sample Page</title>
</head>
<body>
<p>Hello World!</p>
</body>
</html>
对应的DOM文档树就如下图所示:
1.2.2.1 DOM起因
在Netscape的Navigator 4和Microsoft的IE4中,都支持不同形态的DHTML,即不刷新页面而修改页面外观和内容,但是由于两家公司实现方式和思路不同,导致Web分裂的可能性出现,人们担心之后会出现面向浏览器开发网页的尴尬局面,于是万维网联盟(W3C,World Wide Web Consortium)站出来表示要指定DOM标准。
DOM事实上已经在很多语言中被实现了,但是在浏览器中,DOM就是由ECMAScript实现的。
1.2.2.2 DOM级别
- DOM Level 1:目的是为了映射文档结构,包括两个部分:
- DOM Core:提供映射XML文档,方便访问和操作文档任意部分的方式
- DOM HTML:扩展映射Core,并增加了特定于HTML的对象和方法
- DOM Level 2:扩展部分如下:
- DOM视图
- DOM事件
- DOM样式
- DOM遍历和范围
- DOM Level 3:增加了DOM Load and Save、DOM Validation模块,Core完全支持了XML 1.0
- DOM Living Standard / DOM4
1.2.2.3 其他DOM
下面语言基于HTML,有自己的DOM方法和接口
- SVG(Scalable Vector Graphics,可伸缩矢量图)
- MathML(Mathematical Markup Language,数学标记语言)
- SMIL(Synchronized Multimedia Intergration Language,同步多媒体集成语言)
1.2.2.4 Web浏览器对DOM的支持情况
1.2.3 BOM
浏览器对象模型(Browser Object Model)用于支持访问和操作浏览器窗口,一直都没有相关标准制定,HTML5以尽可能规范的形式制定了一些BOM特性,但还是存在一些特性会因浏览器而异。
BOM主要针对浏览器窗口和子窗口(frame),如浏览器窗口弹出、移动、缩放、关闭、location、navigator、screen、performance对象、cookie等。
1.3 JavaScript版本
Mozilla作为Netscape的唯一仍在延续最初JavaScript版本编号的浏览器厂商,仍在不停的更新JavaScript的版本,其浏览器对应的JavaScript版本号为正统JavaScript版本号,其他浏览器对JavaScript版本的支持多数是指对应不同的ECMAScript和DOM版本号。