前言
大家好,我是你们的朋友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 Core
和DOM 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由三个部分组成:
ECMAScript
由ECMA-262
定义并提供核心功能文档对象模型DOM
提供与网页内容交互的方法和接口浏览器对象模型BOM
提供与浏览器交互的方法和接口
JavaScript的三个部分得到了5大浏览器(IE、Firefox、Chrome、Safari和Opera)不同程度上的支持,谁支持的最差,大家也都清楚。ES5基本基本都支持,ES6向上的,也都在慢慢完善。DOM基本都支持。BOM大家也都假定存在很大一部分的公共特性。