= “红宝书”_JavaScript高级程序设计(第4版) 之「JS的前世今生」

2022-10-26 08:52:20 浏览数 (2)

前言

大家好,我是你们的朋友HoMeTown,web领域有一本神书大家应该都有看过,这本书我也看过不下3遍了,但是每次看都是粗粗的略过一些重要的知识点,甚至一些面试过程中的问题,在这本书里都能找到答案。

遗憾的是工作这么多年,到现在为止对这本书都没有一个系统的知识点记录,这次想用一周的时间从头读一遍这一本JavaScript高级程序设计【第4版】,并把重要的知识点以便于理解的方式记录下来,并在部分知识点中,附加平时工作中可能会遇到的场景,分享给大家,共勉之。

参考文献

JavaScript高级程序设计(第4版)

JavaScript?

1995年JavaScript问世,刚开始的主要用途是做输入验证,也就是表单验证,后来JavaScript被网景公司加入到Navigator浏览器中,从此JavaScript成为主流浏览器的标配。

如今JavaSciprt已经被广泛使用,场景包括但不局限于桌面浏览器 手机浏览器 服务端 屏幕阅读器,也能实现复杂的计算机计算与交互。

历史回顾

1995年,网景公司里一个叫Brendan Eich的工程师开发了Mocha(后来改名为LiveScript)脚本语言,为了赶时间与Sun公司组成开发联盟,共同完成了LiveScript脚本语言,正式上线之前,为了蹭当时Java的热度,改名为JavaScript

1996年,微软决定带着Internet Explorer(IE)重磅进入Web浏览器领域,微软推出的IE3其中包含名为JScript的JavaScript实现。2022年,IE正式退出了历史舞台。

微软的JavaScript网景JavaScript出现了两个版本的JavaScript,还没有规范的语法与特性标准,出现了冲突,随之,JavaScript走上了标准化的征程。

1997年JavaScript1.1作为提案,提交给欧洲计算机制造商协会(Ecma),委员会TC39(来自各个厂牌的顶级工程师)负责标准化任务,推出了ECMA-262,也就是ECMAScript这个新的脚本语言标准。

1998年国际标准化组织(ISO)国际电工委员会(IEC)ECMAScript采纳为标准ISO/IEC-16262,从此,各个厂牌浏览器开始以ECMAScript作为自己JavaScript实现的一句,但是具体实现还是有所不同,安排的工期有所不同,于是出现了浏览器兼容问题。(此处que一下IE)。

JavaScript实现

JavaScript在开发的过程中远远不值ECMA-262定义的那样,而是基于ECMA-262做了更广的延伸,完整的JavaScript包含:

  • ECMAScript
  • DOM
  • BOM
ECMAScript

ECMAScript不局限于浏览器,ECMA-262只是将这门语言作为基准来定义,其中只定义了:

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

官方

ECMA-262 第1版 删除各个厂牌的特定代码,要求支持Unicode,而且内置对象与平台无关。

ECMA-262 第2版 编校工作,为了符合ISO & IEC的要求

ECMA-262 第3版 第一次真正对标准进行更新,更新字符串处理、错误定义和数值输出,增加正则表达式、控制语句、try/catch,标志着ECMAScript 作为一门真正的变成语言的时代要来了

ECMA-262 第4版 一次彻底修订,重新召集TC39,包括强类型变量、新语法和数据结构、类、继承以及操作数据的方法,但是,TC39的子委员会中人觉得跳动太大了,修改的太多,提交了一个改动较少的提案ECMAScript 3.1,TC39觉得还不错,第4版就被废除了,不然我们应该说从ES4开始就推出了的概念。

ECMA-262 第5版 就是ECMAScript 3.1,2009年12月3日发布,新增解析&徐丽华JSON数据的JSON对象,新的严格模式,2011年6月对这个版本补充了一个修订版,无新增功能,只改了一些规范中的错误。

ECMA-262 第6版 俗称ES6、 ES2015,2015年6月发布,对ECMAScript来说,这一版具有重要意义,正式支持了类、模块、迭代器、生成器、箭头函数、代理等数据类型(鄙人2016年入行,时机很好)

ECMA-262 第7版 俗称ES7、ES2016,2016年6月发布,仅包含少量语法层面的增加(e.g. Array.prototype.includes)

ECMA-262 第8版 俗称ES8、ES2017,完成与2017年6月,增加了async/await、Object.values/entries,明确支持对象字面量最后的逗号,因为好多服务端语言中,是不支持字典后面还有逗号的。

ECMA-262 第9版 俗称ES9、ES2018,2018年6月发布,新增异步迭代、rest、Promise.finally

ECMA-262 第10版 俗称ES10、ES2019,2019年6月发布,新增Array.flat()/flatMap()、String.prototype.trimStart/trimEnd等等等等

ECMA-262 第11版,俗称ES11、ES2020,2020年6月发布,新增类的私有属性 #、动态 import导入、bigInt、globalThis

这个globalThis我还真不知道,看了一下,浏览器中:

node环境中:

ECMA-262 第12版,俗称ES12、ES2021,2021年6月发布,新增逻辑操作符 ?? ?. !.等,这个运算符真的很香,用法 戳这里

JavaScript、ECMAScript、ECMA-262 三者之间的关系

ECMAScript 只是对实现ECMA-262这个规范描述的所有方面的一门语言的称呼,JavaScript实现了ECMAScript。

ECMAScript符合性

要成为ECMAScript的实现,必须满足以下条件:

  • 满足ECMA-262中描述的所有类型、值、对象、属性、函数、以及语法和语义
  • 支持Unicode字符标准

初次之外可以在此基础上进行扩展

DOM

文档对象模型(Documnet Object Model),DOM将页面抽象问一组分层节点,HTML或者XML页面每个元素都是一个节点(虚拟DOM?),比如:

会被抽象成这样:

虚拟DOM实锤。

DOM通过创建表示文档的树,开发者通过一些DOM API 完成增删改查。

为什么要搞DOM?

可以在不刷新的情况下修改页面外观和内容。问题是,两大厂牌微软网景又搞出了两个不同的动态HTML策略,也就意味着,你写同样一个HTML,无法在浏览器中通过DOM API修改内容,得到一样的效果。因为他们抽象HTML的方式不同。

因此,万维网联盟(俗称W3C,World Wide Web Consortium)开始制定DOM标准,1998年10月,DOM 1级 成为W3C的推荐标准。

DOM级别

DOM 1级 的目标是映射文档结构,有DOM CoreDOM HTML两个模块组成,前者提供一种映射XML文档,从而方便访问和操作文档任意部分的方式,后者扩展了前者,增加了特定于HTML的对象和方法。

DOM 2级新增了以下模块:

  • DOM视图 描述追踪文档不同视图的接口
  • DOM事件 描述事件及事件处理的接口
  • DOM样式 描述处理元素CSS样式的接口
  • DOM遍历和范围描述遍历和操作DOM树的接口

DOM 3级增加了以同一的方式加载和保存文档的方法

平时我们其实还是DOM 2级用的会比较多一点

BOM

浏览器对象模型(Browser Object Model),操作浏览器的窗口,开发者可以控制浏览器显示页面之外的部分。它是没有相关标准的JavaScript实现,包括:

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

因为很长时间都没有标准,各个厂牌浏览器都是自己实现自己的BOM,有一些默契的约定俗成,比如window对象和navigator对象,而且大家都会给他们定义自己的属性和方法,HTML5出现以后,各个厂牌应该会日趋一致。

总结

JavaScript由三个部分组成:

  • ECMAScriptECMA-262定义并提供核心功能
  • 文档对象模型DOM 提供与网页内容交互的方法和接口
  • 浏览器对象模型BOM 提供与浏览器交互的方法和接口

JavaScript的三个部分得到了5大浏览器(IE、Firefox、Chrome、Safari和Opera)不同程度上的支持,谁支持的最差,大家也都清楚。ES5基本基本都支持,ES6向上的,也都在慢慢完善。DOM基本都支持。BOM大家也都假定存在很大一部分的公共特性。

0 人点赞