3年前我刚开始学前端的时候,老师给推荐了《高程三》。这本书是2012年出版,并没有涉及到ES6,但它仍然是一本有深度的经典之书,我没有全部读完,只是读了大概一半。现在,我得到了《高程四》的资源,所以准备一边读一边在这里记录。
对资源感兴趣的小伙伴可以给我留言哈。
这一篇我来记录一下第一章,关于“什么是JavaScript”。
1.1
目录
1.1 JavaScript的历史
1.2 JavaScript的组成
1.2.1 ECMAScript
1.2.2 DOM
1.2.3 BOM
1.3 JavaScript的版本
1.4 总结
JavaScript的历史
关于JavaScript的历史,我结合一下这本书里讲的和我自己所了解的知识,来简单说一下。
首先,JavaScript是为了什么诞生的?最初是为了能在客户端进行表单验证。
在很多年前,web并没有现在这么华丽和强大,尤其是客户端,一开始只是用来展示数据而已。表单的验证都是靠服务器来完成的,但是这样用户体验很不好——你好不容易填写完了表单,点击提交,过了好一会儿才告诉你,刚才你漏填了一个必填字段,而且之前填写的全被清空了,需要重新填写!如果客户端可以完成对表单数据的校验,就不必这样了,还能减轻服务器的负担,这就是当时的背景。
然后,JavaScript诞生的过程是怎样的?这里我很想用一些破碎的关键词,让你们串联起来看——1995年、网景公司、Netscape Navigator浏览器2、布兰登·艾奇、LiveScript、Sun公司、微软、JScript、ESCMScript1.0。
完整的故事是这样的——
1995年,为了做出具有“能在客户端进行表单验证”的脚本语言,网景公司让工程师布兰登·艾奇来开发这款语言。它最初的名字是叫Mocha,后改为LiveScript。
布兰登大概只用了10天就完成了它最初的模样,但是他本人对这个作品并不满意——可能是因为公司要求他这门语言语法要类似Java,而他比较喜欢的是基于原型的语言,所以他认为像这样披着Java语法的外衣、又基于原型的语言比较“四不像”。Java在当时已经是热门语言了,网景公司与Sun公司当时有合作,于是LiveScript蹭了Java的热度,成了“JavaScript”。
JavaScript最初的版本(1.0)是被包含在Netscape Navigator2浏览器中的,第二个版本JavaScript1.1则是在Netscape Navigator3中。作为网景公司的竞争者,微软不甘示弱,也做了自己的JavaScript,名叫JScript,被包含在1996年发布的IE3里。
于是,JavaScript有了两个不同的版本,这样不利于程序员的开发,急需一个统一的标准!在1997年,TC39委员会打造出了ECMAScript,这就是JavaScript的标准。虽然各家浏览器的实现不同,但都是按照这个标准来的。
1.2 JavaScript的组成
JavaScript由ECMAScript(核心)、DOM API(文档对象模型)和BOM API(浏览器对象模型) 组成。
其中DOM和BOM其实都是来自于浏览器这个宿主环境,换言之,在其他环境(如node)中将不能使用,但仍然可以使用ES的语法。
1.2.1 ECMAScript
ECMAScript定义了哪些内容?
语法、类型、语句、关键字、保留字、操作符、全局对象。
ECMAScript版本的历史是怎样的?
ES1基本是与网景公司的JavaScript1.1是相同的,但删除了浏览器的特定代码,做了少量细微修改。。
ES2并没有在ES1的基础上增减或改变特性,只是做了编校的工作。为了能严格符合ISO/IEC-16262的要求。
ES3第一次对这个标准做了更新,加上了一些重要的特性:字符串的处理、错误的定义、字符输出、正则表达式、try/catch语句……
ES4比ES3更为激进,是一次彻底的修订。新特性包括:强类型变量、新语句和数据结构、真正的类和经典的继承,以及操作数据的新手段。最终因为跳跃性太大,ES4在发布前就被废弃了。
ES5诞生与2009年,只是在ES3的基础上加了一些很少的东西,原本被称为ES3.1。它厘清了ES3的歧义,新增了JSON、方便继承和高级属性定义的方法和严格模式。2011年6月,ES5.1发布,只是修改了ES5规范的错误,并没有更新特性。
ES6诞生于2015年,又被称为ES2015,这是一个非常重要的版本。它支持了类、模块、迭代器、生成器、箭头函数、契约、反射、代理和众多新的数据类型。
ES7诞生于2016年,又被称为ES2016。更新了Array.prototype.includes(判断数组里是否包含某个元素) 和指数操作符(Math.pow)这两个特性。
ES8诞生于2017年,新增了异步函数(async/await)、SharedArrayBuffer 及Atomics API,以及Object.values() / Object.entries() / Object.getOwnPropertyDescriptors() 和字符串填充方法,另外明确支持对象字面量最后的逗号
ES9诞生于2018年,新增了异步迭代、剩余和扩展属性(...)、一组新的正则表达式特性、 Promise finally() ,以及模板字面量修订。
ES10诞生于2019年,明确定义了Function.prototype.toString() 的返回值并固定了Array.prototype.sort() 的顺序(排序后并列的元素的先后顺序与排序前一致)增加了Array.prototype.flat() / flatMap() 等特性。
1.2.2 DOM
DOM是什么?
DOM全称是Document Object Model,也就是“文档对象模型“,它把HTML或XML文档抽象成了一组分层节点。
DOM通过创建表示文档的树,让开发者可以随心所欲地控制网页的内容和结构。使用DOM API,可以轻松地删除、添加、替换、修改节点。
为什么DOM是必须的?
微软的IE4和网景的Netscape Navigator 4采用了不同的思路实现了DHTML,虽然开发者通过它们都可以修改页面的结构,但是必须写两套不同的代码来兼容。这样显然是违背了web的跨平台本性,人们得面向浏览器开发。所以W3C(万维网联盟)制定了DOM标准。
DOM的级别有哪些?
W3C推荐的第一个DOM的版本是DOM Level 1,出现与1998年10月。它包括DOM Core (访问和操作XML的节点的方法)与 DOM HTML(扩展了DOM Core,并增加了HTML特有的对象和方法),目标是映射文档结构。
DOM Level 2新增了更多内容。它扩展了DOM Level 1的DOM Core,支持了XML的命名空间;它新增了几个模块:DOM视图(追踪文档不同视图)、DOM事件(事件及事件处理)、DOM样式(处理CSS样式)、DOM遍历和范围(遍历和操作DOM树)。
DOM Level 3进一步扩展了DOM,增加了以统一的方式加载和保存文档的方法,还有验证文档的方法。在Level 3中,DOMCore经过扩展支持了所有XML 1.0的特性,包括XML Infoset、
XPath和XML Base。
目前,W3C不再按照Level来维护DOM了,而是作为DOM LivingStandard来维护,其快照称为DOM4。DOM4新增的内容包括替代Mutation Events的Mutation Observers。
并没有一个DOM版本叫DOM Level 0,应该把DOM Level 0 理解成DOM Level 1的标准出现之前,IE4与Netscape Navigator 4中最初支持的DHTML。
1.2.3 BOM
BOM全称是Browser Object Model(浏览器对象模型),是一组支持访问和操作浏览器窗口的API。使用BOM,开发者可以操控浏览器显示页面之外的部分。与众不同的是,它是唯一一个没有相关标准的JavaScript实现。
HTML5改变了这个局面,这个版本的HTML以正式规范的形式涵盖了尽可能多的BOM特性。
1.3 JavaScript的版本
由于JavaScript一开始是网景公司开发的,所以只有网景公司开发的浏览器才有对应的JavaScript版本号,从Netscape Navigator 4的1.0版本到FireFox 4 的1.8.5。
版本号原本是根据Firefox 4要发布JavaScript 2.0决定的,,但是JavaScript的发展,让2.0无法作为目标而存在,所以版本号在FireFox 4 之后就不再编排了。
所以,多数浏览器“对JavaScript的支持程度”,并不是指“支持了哪个版本的JavaScript”,而是指“实现ECMAScirpt和DOM的程度”。
1.4 总结
JavaScript是一门用来与网页交互的脚本语言,包含以下三个组成部分。
ECMAScript:由ECMA-262定义并提供核心功能。
文档对象模型(DOM):提供与网页内容交互的方法和接口。
浏览器对象模型(BOM):提供与浏览器交互的方法和接口。
JavaScript的这三个部分得到了五大Web浏览器(IE、Firefox、Chrome、Safari和Opera)不同程度的支持。所有浏览器基本上对ES5(ECMAScript 5)提供了完善的支持,而对ES6(ECMAScript 6)和ES7(ECMAScript 7)的支持度也在不断提升。这些浏览器对DOM的支持各不相同,但对Level 3的支持日益趋于规范。HTML5中收录的BOM会因浏览器而异,不过开发者仍然可以假定存在很大一部分公共特性。