《JavaScript高级程序设计》红宝书第一遍阅读(了解概念)
第1章——什么是JavaScript
DOM将整个页面抽象为一组分层节点。
BOM用于支持访问和操作浏览器的窗口。
第2章——HTML中的JavaScript
- 2.1 < script >元素
元素 | 描述 |
---|---|
async | 立即开始下载脚本,但不能阻止其他页面动作,比如下载资源或等待其他脚本加载,只对外部脚本文件有效; |
charset | 使用src指定代码字符集,很少使用,大多数浏览器不在乎它的值; |
crossorigin | 配置相关CORS(跨源资源共享)设置。默认不使用CORS; |
defer | 表示在文档解析和显示完成后,再执行脚本,只对外部脚本文件有效; |
integrity | 运行比对接收到的资源和指定的加密签名以验证子资源的完整性(SRI,Subresource Intergrity)。可以用于确保内容分发网络(CDN,Content Delivery Network)不会提供恶意内容。 |
src | 包含要执行的代码的外部文件; |
type | 表示代码中脚本语言的内容类型(也称MIMI类型),这个值始终是“text/javascript”,如果这个值是module,则代码会被当作ES6模块,而且只有这种时候,代码中才能出现import和export关键字。 |
2.1.3 异步加载脚本
async属性和defer,两者都能适用于外部脚本,告诉浏览器立即开始下载。
<html>
<head>
<title>异步执行脚本</title>
<script async src="main.js></script>
<script async src="main1.js></script><!--可能先于第一个脚本执行-->
</head>
<body>
</body>
</html>
2.1.4 动态加载脚本
let script = document.createElement('script');
script.src = 'gibberish.js';
script.async = false;
document.head.appendChild(script);
第3章——语言基础
var声明的变量,在函数退出时被销毁。
let声明的范围是块作用域,var声明的范围是函数作用域。
let声明的变量不会在作用域中被提升。
const声明变量是必须同时初始化变量
const优先,let次之。
- 3.4数据类型
typeof操作符:用来区分函数和其他对象
undefined 类型:声明了变量但是没有初始化(没有值),undefined是由null中派生而来的。
null类型:表示一个空对象指针。
boolean类型:要将一个其他类型的值转换成布尔值,可以调用Boolean()转换函数。
Number类型:表示整数和浮点值,范围在Number.MIN_VALUE~Number.MAX_VALUE之间。
NaN(Not a Number)意思'不是数值',表示本来要返回数值的操作失败了。
数值转换:Number、parseInt()、parseFloat(),
模板字面量:求值后得到的字符串。
Symbol类型:确保对象属性使用使用唯一的标识符,不会发生冲突的危险。
.asyncIteraltor表示异步迭代器API的函数。
.hasInstance用来确定一个对象实例的原型链上是否有原型。
.for()表示对每个字符串键都执行幂的操作。
.keyfor()查询全局注册表。
.isConcatSpreadable表示”一个布尔值,如果是true,则意味着对象应该用Array.prototypr.concat()打平其数组元素“。
- 3.5一元操作符(只操作一个值的操作符)
位操作符:有符号整数使用32位前31位表示整数值,第32位表示数值的符号,这一位称为符号位,他的值决定了数值其余部分的格式。
布尔操作符:逻辑与&&(短路操作符)、逻辑或||、逻辑非!
乘性操作符:乘法*、除法/、取模%
指数操作符:Math.pow(底数,指数)
加性操作符:加法+、减法-
关系操作符:小于<、大于>~~~
- 3.6语句
for-in语句:for(property in windows ) statment,每次循环都给变量property 赋予一个 windows对象的属性作为值,直到所有属性都被枚举一遍。
for-of语句:for(const el of [1,3,5,7]),循环会持续到所有元素都别迭代完。
break语句:跳出当前循环,执行循环后的下一条语句;
continue语句:退出循环后,再次回到循环顶部重新开始执行。
- 3.7函数
diff()函数:结算两个数值的差。sayHi()函数:合并传递的参数,并用逗号隔开。
第4章——变量、作用域与内存
- 4.2执行上下文与作用域。
每个上下文都有一个关联的变量对象,这个上下文中定义的所有变量和函数都存在于这个对象上。
- 4.3垃圾回收
确定某个变量不会再使用,然后释放它占用的内存,周期性清理,属于’不判定的‘问题。
两种标记策略:标记清理、引用计数。
标记清理流程:垃圾回收机制运行的时候,会标记内存中存储的所有变量,被加上标记的变量就是待删除状态,随后垃圾回收程序做一次内存清理,就会销毁带标记的所有值并回收他们的内存。
引用计数:对每个值都记录它被引用的次数,变量被引用一次,那么引用数+1;变量被其他值覆盖,引用值-1;当引用值为0的时候,回收其内存。
第5章——基本引用类型
- 5.3 原始值包含方法
trim()方法:创建字符串的一个副本,删除前后所有空格符,再返回起结果。
repeat()方法:接收一个参数,将字符串复制参数中指定的次数,然后拼接所有副本的结果。
- 5.4 Math
Math.round()方法执行四舍五入。
.random()生成随机数。
第6章——集合应用类型
- 6.1 Object
object适合存储和在应用程序之间交换数据。
对象字面量:对象定义的简写形式,目的是为了简化包含大量属性的对象的创建。
- 6.2 Array 数组
form()用于将类数组结构转换为数组实例;
迭代器方法:keys()返回数组索引,values()返回数组元素,entries()返回索引/值对
栈方法:posh()推入,pop()弹出,遵循后进先出的原则。
队列方法:shift()删除数组中第一项,并返回数组长度;posh()在数组末尾添加数据;遵循先进先出原则。
排序方法:reverse()反向排序;sort()中包含一个比较函数,用于判断那个值应该排在前面。
操作方法:concat()在现有数组后面创建一个新的数组;slice()创建一个包含原有数组中一个或多个元素的心数组;splice()在数组中插入新的元素,删除传递2个参数,第一个是元素的位置,第二个是删除的数量,插入传递3个参数;
迭代方法:every()对数组每一项都远行传入的函数;filter();foreach();map();som();
归并方法:reduce()从数组第一项开始遍历到最后一项;reduceRight()从数组的最后一项遍历到第一项;接收四个参数:上一个归并值、当前项、当前项的索引、数组本身。
- 6.4 Map
Map是一种新的集合类型,使用对象属性作为键,再使用属性来引用值。
Map和Object的区别:内存方面,Map比Object多存储50%的键/值对;插入/删除性能方面,插入速度不会随着键/值对的数量增加而线性增加;查找速度,Object当做数组使用的情况下,Object速度更佳;
- 6.6 Set
Set在很多方面是在加强Map
第7章——迭代器与生成器
迭代器:是一个对象,它定义了一个序列,并在终止时返回值。两个返回值:value、done。
生成器:允许定义一个包含自由迭代算法的函数,同时它可以自动维护自己的状态。
可迭代对象:若一个拥有迭代行为的对象。如Array、Map拥有默认的迭代行为。
第8章——对象、类与面向对象编程
- 8.1 理解对象
面向字面量书写方式:
let person = {
name: "kuishou" ,
age:21,
job:"前端开发",
sayName(){
console.log(this.name);
}
};
- 8.4 类
定义类的两种方式:声明类和类表达式 calsss Person{} 和 const Animl = class{};
函数声明可以提升,类的定义不能。
类的构造函数 :不定义构造函数相当于将构造函数定义为空函数。
继承:不仅可以继承一个类,也可以继承普通的构造函数。
抽象基类:可供其他类继承,当本身不会被实例化,使用new,target检测是不是抽象基类.
第9章——代理与反射
- 9.1 代理
拦截并向基本操作嵌入额外行为的能力;target目标对象;handler代理对象(Reflect也可以)
第10章——函数
- 10.1 闭包
闭包:指的是引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。本质是包含函数的活动对象加长了其作用域链。
this对象:把函数当成方法调用的上下文对象。
递归:一个函数通过名称自己调用自己。
第11章——期约与异步函数
- 11.2 期约(promise):是对 尚不存在结果 的一个替身。
三种状态:待定、兑现、拒绝
Promise.resole()可以实例化一个解决的期约。
Promise.prototype.catch()语法糖,用于给期约添加 拒绝处理程序。
Promise.prototype.finally()用于添加清理代码。
Promise.all()在一组期约全部解决之后再解决。
Promise.race()最先解决或拒绝的期约 。
- 11.3 异步函数
async关键字用于声明异步函数;
await关键字用于暂停异步函数代码的执行,等待期约解决。
第12章——BOM
- 12.1 Windwos对象
BOM 的核心是windows对象,windows对象有两个身份,另一个是ECMAScript中的Global对象,另一个是浏览器窗口的JavaScript接口。
第13章——客户端检测
- 能力检测:检测浏览器是否含有某种特性
- 用户代理检测:通过用户代理字符串确定浏览器。
第14章——DOM
DOM表示由多层节点构成的文档,DOM树。
Element Traversal API 五个属性:
childElementCount,返回元素数量(不包含文本节点和注释)。
firstElementChild,指向第一个Element类型的子元素。
lastElementChild,指向最后一个Element类型的子元素。
previousElementSibling,指向前一个Element类型的同胞元素。
nextElementSibling,指向后一个Element类型的同胞元素。
第15章——DOM拓展
-
15.1 Selectors API
-
querySelector()返回匹配该模式的第一个后代元素,如果没有匹配项则返回结果null。
let body = document.querySelector('body')
第17章——事件
-
17.1 事件流:页面接收事件的顺序。
-
事件传播的三个阶段:①事件捕获阶段:事件是从Document节点自上而下向目标节点传播。②目标阶段:达到事件对象的事件目标,找到目标节点后完成后停止。③事件冒泡阶段:事件再从目标节点自下而上向Document节点传播。
第20章——Streams API
- 20.9 可读流:通过公共接口读取数据块的流,由消费者进行处理,使用getReader()方法获取流的锁
- 可写流:通过公共接口写入数据块的流,生产者将数据写入流。
- 转换流:包含可读流和可写流,可根据需要检查和修改流内容。
- 20.11 Web组件
- 一套用于增强DOM行为的工具,包括影子DOM、自定义元素和HTML模板。
- 影子DOM通过attachShadow()方法创建并添加给有效HTML元素。
第23章——解析与序列化
- 23.2 JSON对象
- 序列化:stringify()方法,第一个参数是过滤器,可以是数组或函数;第二个参数用于缩进结果JSON字符串的选项。
- 解析:parse()方法又叫复活函数,包含两个参数,属性名(key)和属性值(value)。可以接收一个额外的参数,这个函数会正对每个键/值对都调用一次。
第24章——网络请求与远程资源
- GET请求:用于向服务器查询某些信息。
- POSE请求:哟用于向服务器发送应该保存的信息。
- Fetch API :浏览器会向给定的URL发送请求,读取响应、处理状态码
- Web Socket(套接字):通过一个长时连接实现与服务器全双工、双向的通信。在JavaScript创建Web Socket的时候,一个HTTP请求会发送到服务器以初始化连接,服务器响应后,连接使用的Upgrade头部从HTTP切换到Web Socket协议,使用该协议的专有服务器。
第26章——模块
- 本质上是键/值实体,
- ES6模块默认在严格模式下执行,不共享全局命名空间。
第27章——工作者线程
- JavaScript是单线程的,为了为了解决并发问题,JavaScript提出了工作者线程的三种类型
- 专用工作者线程:让脚本单独创建一个JavaScript线程,以执行委托的任务。
- 共享工作者线程:创建到的线程可以别多个不同的上下文使用,包括不同的页面。
- 服务工作者线程:拦截、重定向和修改页面发出的请求,充当王阔请求仲裁者的角色。