博主以扎实JavaScript基础为目的,以《JavaScript高级程序设计(第四版)》为核心参考资料,以一个“复习者”的角度有针对性地来创作这期专栏。文章加入了博主的很多思考和开发经验,关注初学JavaScript时容易忽略的地方,着重总结了ECMAScript新标准知识点的特性和应用场景。最终,本专栏将覆盖完整的JavaScript知识体系,以辅佐各路豪杰在开发路上的稳步前进。
专栏传送门:https://blog.csdn.net/huoyihengyuan/category_10586561.html
1995年,中国正式提出科教兴国战略,全面落实科学技术是第一生产力。
在地球的另一边,JavaScript问世。
当今,大多数时候,我们注册一个网站账号时,会被要求密码包含大小写等特定格式,以增加密码安全性。如果我们输入了不符合要求的密码时,就会即时收到一个很友好的提示语:“密码需要包含大小写”供我们进行矫正。
但在过去,这种验证是要我们提交之后,等待服务器给出反馈结果,在当时的低网速环境下,每一次漫长的等待都考验着人们的耐心。
在这样的环境下,网景公司的Brendan Eich开发了一款脚本语言LiveScript,服务于网景公司的Netscape浏览器。当时Java被炒的火热,网景在临近发布LiveScript时临时改名为JavaScript,当然效果很成功。然而很快,微软也开发了一套JavaScript的实现,服务于IE浏览器,但为了避免许可纠纷,特意区别命名为JScript。(我们接下来分别称之为网景JS和微软JS)
于是业界便出现了这“真假美猴王”,孙悟空(网景JS)和六耳猕猴(微软JS)倒也不打架,各占一个山头,可这就难为了广大猴子猴孙,去不同的山头需要用不同的猴语,随着文明的发展,需要学习的猴语又越来越多。
后来,孙悟空向如来佛祖提交了自己的语言档案,希望统一猴届语言。后来如来佛祖组织了“第39技术委员会(TC39)”,并邀请了所有对统一猴语感兴趣的猴帮。
终于,在数个月之后,ECMA-262诞生了,也就是ECMAScript(发音为“ek-ma-script”)这个新脚本语言标准。后来,各家浏览器均以ECMAScript作为自己的JavaScript实现依据。
我们常常把ECMAScript当作JavaScript,但实际上JavaScript拥有更大的范畴。
完整的JavaScript包含三部分:
ECMAScript可以理解为一种标准,Web浏览器只是其中一种实现这套标准的宿主环境。宿主环境提供了最基本的标准的实现,同时也提供了与环境自身交互必须的拓展。
ECMAScript并没有实现输入输出,我们常在浏览器中运行的打印语句
console.log(‘out’)
就是Web浏览器的拓展功能。
除了Web浏览器,其他宿主环境还有服务器端JS平台Node.js和即将被淘汰的Adobe Flash。
如果不涉及浏览器的话,ECMA-262只定义了一些基本的层面:
我们经常听到诸如ES3、ES5和ES2015等等的名词,这其实就是ECMAScript版本简称。ES1可以理解为标准的ECMAScript第一版,而真正标志ECMAScript作为一门真正的标准语言的时代来临的事件,是ES3的问世。它更新了字符串的处理、错误定义和数值输出,增加了对正则表达式的、新控制语句和try/catch异常处理的支持等等。
为什么没听到过大家讨论ES4?因为ES4的提案太过激进,几乎定义了一门新语言,包括了强类型变量等等,以至于最后被废掉了。
所以后来下一次的ECMAScript新版本就是ES5,于2009年发布,增加了JSON数据的解析和序列化、方便继承的方法、严格模式等等。
ECMA-262第六版,俗称ES6、ES2015或ES Harmony(和谐版),于2015年发布,包含了大概有史以来最重要的一批增强特性:类、模块、迭代器、生成器、箭头函数、期约、反射、代理和新数据类型。
ECMA-262第七版,称为ES7、ES2016,于2016年发布,进行了少量的语法层面增强,如Array.prototype.includes和指数操作符。
ECMA-262第八版,称为ES8、ES2017,于2017年发布,增加了async/await、ShareArrayBuffer、Atomics API以及Object.value()、Object.entries()、Object.getOwnPropertyDescriptors()和字符串填充方法,另外明确支持对象字面量最后的逗号(这个细节令人舒服,这个逗号一直都像一个讨厌的苍蝇一样,影响着我的coding操作,这下可以轻松愉快地copy代码了)。
ECMA-262第九版,称为ES9、ES2018,于2018年发布,修订包括异步迭代、剩余和拓展属性、Promise finally()等等。
ECMA-262第十版,称为ES10、ES2019,于2019年发布,增加了Array.prototype.flat()/flatMap()、String.prototype.trimStart()/trimEnd()、Object.fromEntries()、Symbol。prototype.description属性,明确定义了Function.prototype.toString()的返回值并固定了Array.prototype.sort()的顺序。
目前所有浏览器基本上对ES5提供了完善的支持,对ES6和ES7的支持也在不断提升,如果需要查看具体的兼容性表格,可以登录https://www.caniuse.com/
。如果条件允许的话,期望开发者也能够与时俱进,不断尝试运用新功能,以完备的姿态去迎接未来,再不济也有babel方便让更多浏览器兼容我们的代码,难道不是吗?
文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在HTML中使用扩展的XML。
DOM将整个页面抽象成一组分层节点,创建出表示文档的树,让开发者可以随心所欲地控制页面的结构。
W3C制定了DOM规范,主要有两个模块构成:
除了DOM Core和DOM HTML之外,有些其他语言也是基于XML的,下面的每一种都增加了该语言独有的DOM方法和接口:
浏览器对象模型(BOM,Browser Object Model)是用于支持访问和操作浏览器窗口的API。
通过BOM,开发者有能力操作页面之外的浏览器部分。总体来说,BOM主要针对于浏览器窗口和子窗口,不过人们通常会把任何特定于浏览器的扩展归在BOM的范畴内。以下就是这样的一些扩展:
过去很长一段时间,每个浏览器实现的都是自己的BOM,现在有了HTML5,BOM的实现细节应该回日趋一致。
关于DOM和BOM的具体讲解,将在后续章节详细说明,这里就不再过多阐述。
JavaScript是历史的产物,包含ECMAScript、DOM和BOM,它的产生铺垫了Web技术的蓬勃发展,尽管它只是一门用于和网页交互的脚本语言。
已经被越来越多的浏览器不断支持JavaScript的新特性,当然未来也会有更多的新方案被纳入标准。作为开发者的我们,需要做到与时俱进,在提升业务能力的同时,也不要忘记回顾这些核心技术和学习新特性。
你不可能永远年轻,但永远都有年轻人。