简介
- 布兰登·艾奇--->JS之父
- JS的三大组成
- 核心(ECMAScript),由 ECMA-262 定义,提供核心语言功能
- 文档对象模型(DOM),提供访问和操作网页内容的方法和接口
- 浏览器对象模型(BOM),提供与浏览器交互的方法和接口
HTML中使用JS
- 向 HTML 页面中插入 JavaScript 的主要方法,就是使用<script>元素
- JS为Web 增加统一的脚本支持。而 Web 诞生早期的很多做法也都保留了下来,并被正式纳入 HTML 规范当中
- 考虑到约定俗成和最大限度的浏览器兼容性,目前 type 属性的值依旧还是
text/javascript。不过,这个属性并不是必需的,如果没有指定这个属性,则其默认值仍为text/javascript - HTML 4.01 为<script>标签定义了 defer 属性。这个属性的用途是表明脚本在执行时不会影响页面的构造。也就是说,脚本会被延迟到整个页面都解析完毕后再运行。因此,在<script>元素中设置defer 属性,相当于告诉浏览器立即下载,但延迟执行
数据类型
null 和 undefined
-
位于 null 和 undefined 之间的相等操作符(==)总是返回 true,不过要注意的是,这个操作符出于比较的目的会转换其操作数
-
Undefined 类型只有一个值,即特殊的 undefined。在使用 var 声明变量但未对其加以初始化时,这个变量的值就是 undefined
-
Null 类型是第二个只有一个值的数据类型,这个特殊的值是 null。从逻辑角度来看,null 值表示一个空对象指针,而这也正是使用 typeof 操作符检测 null 值时会返回"object"的原因
单线程
JS是单线程的,所有的I/O操作,都有特定的操作队列。
宏任务和微任务
- 宏任务执行结束,会让浏览器刷新,进行一次真实dom操作。
- 微任务是处于两个宏任务之间,微任务的执行结束,不会产生真实dom操作。
- 宏任务与微任务,都有自己的任务队列,所有宏任务在一个队列,微任务在一个队列
- JS将宏任务和微任务依次标记,并放在任务队列中。由浏览器(浏览器是多线程的)发起异步处理。待JS主线程忙完,JS会轮询事件队列,根据添加任务顺序(宏任务1,微任务1,微任务2),将任务依次压栈处理(微任务1,微任务2,宏任务1)
- 当出现多个宏任务和微任务,JS通过事件轮询,先处理位于主线程中的宏任务和微任务,并将其他宏任务和微任务依次放入宏任务队列,微任务队列,并做好标记等待随时调用。待主线程闲时,会查看任务队列,即事件轮询,事件轮询不会停止,只会一直监听任务队列状态。若有任务,主线程会依次执行任务队列中的任务(执行顺序为:宏任务2,微任务2.1,2.2,宏任务3,微任务3.1,3.2)。
JS事件流
特性:事件冒泡
父元素与子元素的相同事件都会执行。
事件为栈结构,父事件先进栈。
网友评论