史前时代
万维网的概念与基础技术,是1989-1991年间由CERN(欧洲核子研究组织)的Tim Berner-Lee创造的。Web技术在高能物理圈内流通了几年,但并未在物理社区外引起强烈反响。它真正引发关注的契机,还是1992年-1993年开发的Mosaic。这款由本科生Marc Andreessen和伊利诺伊大学香槟分校超算中心(NCSA)的Eric Bina研发的应用,本质上定义了[web浏览器]这一全新软件类别。NCSA Mosaic是不仅易装易用,而且带有图形界面的Web客户端。
原始浏览器(Mosaic)—->Netscape Navigator(网景浏览器)(都是由Marc Andreessen和Eric Bina开发的)
简短的历史回顾
1995年,网景公司 一名叫Brendan Eich的工程师,开始为即将发布的Netscape Navigator2开发一个叫Mocha(后来改名为LiveScript)的脚本语言。当时的计划是在客户端和服务端都使用它,它在服务端叫LiveWire。
为了赶上发布时间,网景与Sun公司结为开发联盟,共同完成LiveScript的开发。就在Netscape Navigator正式发布前,网景吧LiveScript改名为javaScript。
由于javaScript1.0很成功,网景又在Netscape Navigator3中发布了1.1版本。尚未成熟的web的受欢迎程度达到了历史新高,微软决定向IE投入更多资源。在Netscape Navigator3发布不久,微软发布了IE3,其中包含了自己名为JScript的javaScript实现。
微软的javaScript实现意味着出现了两个版本的javaScript:Netscape Navigator中的javaScript,以及IE中的JScript。
1997年javaScript1.1作为提案被提交给欧洲计算机制造商协会(ECMA)。第39技术委员会(TC39)承担”标准化一门通用、跨平台、厂商中立的脚本语言的语法和语义”的任务。TC39委员会由来自网景、Sun、微软、Borland、Nombas和其他对这门脚本语言有兴趣的公司的工程师组成。他们花了数月时间打造出ECMA-262,也就是ECMAScript这个新的脚本语言标准。
总结:就是Brendan Eich在网景公司开发的浏览器中开发一门语言,javaScript,由于web的欢迎程度,微软加入了进来,在IE浏览器发布了自己的JSscript的javaScript的实现。由于存在两个版本的javaScript,出现了一个标准组织,把javaScript1.1提交给了ECMA的第39委员会,他们制作了新的脚本语言标准(ECMAScript)。
javaScript的实现
虽然javaScript和ECMAScript基本上是同义词,但javaScript远远不限于ECMA-262所定义的那样。
完整的javaScript实现包含以下几个部分
- ECMAScript(核心)
- DOM(文档对象模型)
- BOM(浏览器对象模型)
ECMAScript
ECMAscript 即ECMA-262定义的语言,并不局限于Web浏览器。这门语言没有输入和输出之类的方法。Web浏览器只是ECMAScript实现可能存在的一种宿主环境。宿主环境提供ECMAScript的基准实现和与环境自身交互必须的扩展。扩展使用ECMAScript核心类型和语法,提供特定于环境的额外功能。其他宿主环境还有服务器端javaScript平台Node.js。
如果不涉及浏览器的话,ECMA-262到底定义了什么?在基本的层面,它描述这门语言的如下部分:
- 语法
- 类型
- 语句
- 关键字
- 操作符
- 全局对象
ECMAScript只是对实现这个规范描述的所有方面的一门语言的称呼。javaScript实现了ECMAScript。
ECMAScript版本
ECMAScript不同的版本以”edition”表示(也就是描述特定实现的ECMA-262的版本)。ECMA-262最近的版本是第10版本。发布于2019年6月。
ECMA-262的第1版本本质上跟网景的javaScript1.1相同,只不过删除了所有浏览器特定的代码,外加少量细微的修改。ECMA-262要求支持Unicode标准,而且对象要煜平台无关。
ECMA-262第2版只是做了一些编校工作,主要是为了更新之后严格符合ISO/IEC-16262的要求,并没有增减或改变任何特性。ECMAScript实现通常不使用第2版来衡量符合性。
ECMA-262第3版第一次真正对这个标准进行更新,更新了字符串处理、错误定义和数值输出,此外还增加了对正则表达式、新的控制语句、try/catch异常处理的支持,以及为了更好地让标准化所做的少量修改。
ECMA-262第4版是对这门语言的一次彻底修订。作为对javaScript在web上日益成功的回应,开发者开始修订ECMAScript以满足全球web开发日益增长的需求。EcmaT39再次被召集起来,以决定这门语言的未来,他们制定的规范在第3版基础上完全定义了一门新语言。TC39委员会的一个子委员会也提出了另一份提案,叫做”ECMAScript3.1″只对这门语言进行了较少的改进。
ECMA-262第3.1版变成了ECMA-262的第5版,新功能包括原生的解析和序列化JSON数据的JSON对象、方便继承和高级属性定义的方法,以及新的增强ECMAScript引擎解释和执行代码能力的严格模式。
ECMA-262第6版,俗称ES6、ES2015或ES Harmony(和谐版),于2015年6月发布。这一版本包含了大概这个规范有史以来最重要的一批增强特性。ES6正式支持了类、模块、迭代器、生成器、箭头函数、期约、反射、代理和众多新的数据类型。
ECMA-262第7版,也称为ES7或ES2016,于2016年6月发布,这次修订只包含少量语法层面的增强,如Array.prototype.includes和指数操作符。
ECMA-262第8版,也称为ES8、ES2017,完成于2017年6月。这一版本主要增加了异步函数(async/await)、SharedArrayBuffer及Atomics API,以及Object.values()/Object.entries()/Object.getOwnPropertyDescriptors()和字符串填充方法,另外明确支持对象字面量最后的逗号。
ECMA-262第9版,也称为ES9、ES2018,发布于2018年6月。这次修订包括异步迭代、剩余和扩展属性、一组新的正则表达式特性、Promise finally(),以及模版字面量修订。
ECMA-262第10版,也称为ES10、ES2019,发布于2019年6月。这次修订增加了Array.prototype.fat()/fatMap()、String.prototype.trimStart()/trimEnd()、Object.fromEntries()方法,以及Symbol.prototype.description属性,明确定义了Function.protoytpe.toString()的返回值并固定了Array.prototype.sort()的顺序。另外,这次修订解决了与JSON字符串兼容的问题,并定义了catch子句的可选绑定。
ECMAScript符合性是什么意思
ECMA-262阐述了什么是ECMAScript符合性。要成为ECMAScript实现,必须满足一下条件
- 支持ECMA-262种描述的所有“类型、值、对象、属性、函数,以及程序语法和语义”。
- 支持Unicode字符标准。
此外 ,扶符合性实现还可以满足下列要求。
- 增加ECMA-262中未提及的“额外的类型、值、对象、属性和函数”。ECMA-262所说的这些额外内容主要指规范中未给出的新对象或对象的新属性。
- 支持ECMA-262中没有定义的“程序和正则表达式语法”(意思是允许修改和扩展内置的正则表达式特性)。
浏览器对ECMAScript的支持。
2008年,五大浏览器(IE、Firefor、Safari、Chrome和Opera)全部兼容ECNMA-262第3版。IE8率先实现ECMA-262第5版,并在IE9中完整支持。Firefox4很快做到了。
DOM
文档对象模型(DOM,Document Object Model)是一个应用编程接口(API)。用于在HTML中使用扩展的XML。
万维网联盟(W3C)开始制定DOM标准的进程。
DOM级别
1998年,DOM Level1成为W3C的推荐标准。这个规范由两个模块组成:DOM Core和DOM HTML。前者提供了一种映射XML文档,从而方便访问喝操作文档任意部分的方式;后者扩展了前者,并增加了特定于HTML的对象和方法。
DOM Level 1的目标是映射文档结构,而DOM Level2的目标则宽泛得多。这个对最初DOM的扩展增加了对鼠标和用户界面事件、范围、遍历的支持,而且通过对象接口支持了层叠样式表(CSS)。
DOM Level2新增了以下模块。以支持新的接口。
- DOM视图:描述追踪文档不同试图的接口。
- DOM事件:描述事件及事件处理的接口。
- DOM样式:描述处理元素CSS样式的接口。
- DOM遍历和范围:描述遍历和操作DOM树的接口。
DOM Level3进一步扩展了DOM,增加了以统一的方式加载和保存文档的方法(包含在一个叫DOM Load and Save的新模块中)还有验证文档的方法(DOM Validation)。在Level3中,DOMCore经过扩展支持了所有XML1.0的特性,包括XML Infoset、XPath和XML Base。
Web浏览器对DOM的支持情况
主流浏览器支持DOM的情况。
BOM
IE浏览器和网景浏览器中,都提供了浏览器对象模型(BOM)API,用于支持访问和操作浏览器的窗口。问题最多的地方,就是它是唯一一个没有相关标准的javaScript实现。HTML5改变了这个局面。BOM主要针对浏览器窗口和子窗口。通常会把任何特定于浏览器的扩展都归在BOM的范畴内。
- 弹出新浏览器窗口的能力;
- 移动、 缩放和关闭浏览器窗口的能力
- navigator对象,提供关于浏览器的详尽信息
- location对象,提供浏览器加载页面的详尽信息
- screen对象,提供关于用户屏幕分辨率的详尽信息。
- performance对象,提供浏览器内存占用、导航行为和时间统计的详尽信息
- 对cookie的支持。
因为在很长时间内没有标准,所以每个浏览器实现的都是自己的DOM。比如window对象和navigator对象。每个浏览器都会给它们定义自己的属性和方法。现在有了HTML5,BOM的实现细节应该会会日趋一致。
小结
javaScript是一门用来与网页交互的脚本语言,包含以下三个组成部分。
- ECMAScript:由ECMA-262定义并提供核心功能。
- 文档对象模型(DOM):提供与网页内容交互的方法和接口。
- 浏览器对象模型(BOM):提供与浏览器交互的方法和接口。
javaScript的这三个部分得到了五大Web浏览器(IE、Firefox、Chrome、Safari和Opera)不同程度的支持。所有浏览器基本上对ES5提供了完善的支持。而对ES6和ES7的支持度也在不断提升。这些浏览器对DOM的支持各不相同,但对Level3的支持日益趋于规范。HTML5中收录的BOM会因浏览器而异。