《JavaScript高级程序设计》红宝书第一遍阅读(了解概念)

311 阅读11分钟

《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线程,以执行委托的任务。
  • 共享工作者线程:创建到的线程可以别多个不同的上下文使用,包括不同的页面。
  • 服务工作者线程:拦截、重定向和修改页面发出的请求,充当王阔请求仲裁者的角色。